سؤال

أنا كائن ثابت محدد في تسجيل الصف ، على غرار:

   class myLoggingClass {
     static java.util.Properties properties;
     ...
     ...
   }

وفقا كتابي المرجعية ، وهذا يعني أن خصائص كائن يتم مشاركتها من قبل جميع حالات صفي.

أجد هذا التعريف غير كاف.أنا أكتب الفئة التي يجري التذرع بها أكثر من مرة في كل تطبيق على المشروع.

كذلك لدينا مشروع يستخدم عدة خدمات ويب قيد التشغيل في نفس القط الحاويات.كل خدمة ويب قد مؤشرات ترابط متعددة.

آلة جافا الافتراضية التي تعمل على المضيف قد أيضا تشغيل واحد أو أكثر من خدمة ويب العميل التطبيقات التي تعمل خارج هر.

لذلك من خلال هذا التعريف قد يكون هر تشغيل خدمات الشبكة متعددة مع المواضيع ، كل وجود العديد من الأشياء التي قد تحتوي على مثيل صفي.

قد يكون هناك أيضا واحد أو اثنين من عملاء ويب قيد التشغيل خارج هر ، ولكن في نفس JVM.أن كل من هذه الحالات من فئة نفس خصائص الكائن ؟ التي من شأنها أن تجعل JVM واسعة.

إذا كان ثابت كائن لا JVM واسعة ، لا أحد يعرف على أي مستوى كل واحد موجود ؟ واحد في هر الحاوية ؟ واحدة في خدمة ويب ، مستقل على شبكة الإنترنت خدمة العميل التطبيق ؟

السبب:عندما أقوم بتحديث خصائص سأحصل على جافا.لانغ.ConcurrentUpdateException من جافا.util.خصائص.

أنا باستخدام ثابت متغير منطقية "قفل" خصائص الكائن عند صفي التحديثات ذلك ، ولكن ليس هذا هو الحفاظ على استثناء من الحدوث.

هذا يقودني إلى الاعتقاد بأن ثابت الكائن في الطبقة قد لا تكون في نفس النطاق مستوى المستخدم في جافا.util.خصائص...ولكن هذا مجرد تخمين.

شكرا على أي مساعدة.

هل كانت مفيدة؟

المحلول

السبب المحتمل الخاصة بك ConcurrentModificationException هو أنك بالتكرار من خلال القيم/مقالات Properties الكائن في موضوع واحد في حين آخر تعديل ذلك في نفس الوقت.لا يمكنك أن تفعل هذا.

يمكنك وضع على آلية تأمين أن أذكر لكم هنا:

أنا باستخدام ثابت متغير منطقية "قفل" خصائص الكائن عند صفي التحديثات ذلك ، ولكن ليس هذا هو الحفاظ على استثناء من الحدوث.

?

لأنه لا يبدو كما لو كنت تستخدم المدمج في تأمين التزامن الطرق في جاوة.

شيئا من هذا القبيل ينبغي أن تمنع المواضيع من قراءة خصائص الكائن في حين ترابط آخر التحديثات:

static Object lockObject = new Object();

...

synchronized(lockObject) {
     // access the Properties object
}

ملاحظة أنك سوف تحتاج إلى القيام بذلك كل مرة كنت الوصول إلى خصائص الكائن ، إما أن يقرأ عليه أو تعديله.

أيضا أنصح أبدا الأجسام الساكنة لتبادل البيانات بين جميع الحالات أو ثابت lockObjects - البيانات العالمية هو الشر - ولكن يبدو كما لو كنت بحاجة إلى هذا لسبب ما.

نصائح أخرى

السكون لا "مشتركة من قبل جميع الحالات من فئة" إنهم لا علاقة لها أن الحالات ؛ انهم ينتمون الى نوع نفسها.ولا سيما متغيرات ثابتة تماما للاستخدام دون أي الحالات التي يجري إنشاؤها.

هذا يعطي فكرة عن نطاق السكون:إنهم راقب من قبل Class وجوه تمثل تحتوي الطبقة ، الذي هو بدوره راقب من قبل ClassLoader أن حملت منه.

اعتمادا على مكان المكتبة هو وضع متغير ثابت قد يكون JVM على نطاق الويب أو تطبيق واسعة - أو ربما شيء بين بين, إذا هر يدعم استضافة متعددة (لا أتذكر مرتجلا).

نظرة على هر الوثائق كيف المكتبات وضعت وكيفية ارتباطها فئة لوادر.على سبيل المثال, هنا هر 6.0 ClassLoader كيفية توجيه, ، أي ما يعادل 5.5.

كيف لا منطقية "قفل" العمل ؟ كنت حقا ينبغي أن الاستخدام السليم قفل (synchronized) للتأكد من أن كل استخدام خصائص الكائن (سواء القراءة والكتابة ، بما في ذلك تأمين طوال الفترة التي يمكنك من خلال تكرار ذلك) بشكل مناسب مؤمن.

بدلا من تغيير "العيش" Properties كائن ، هل تعتبر علاج أنه غير قابل للتغيير لذا عندما تريد تحديث خصائص خذ نسخة تغيير ذلك ، ومن ثم إجراء نسخ "العيش" الإصدار ؟ كنت لا تزال في حاجة إلى منع اثنين من المواضيع المختلفة من إجراء تغييرات في نفس الوقت (أو كنت تفقد بعض) لكنه من المرجح أن تجعل الجانب القراءة أسهل بكثير وأكثر كفاءة.

قد تجد أن نطاق هذه static متغير يقتصر على واحد في ClassLoader التي تم فصلك.لست متأكدا كيف هر يرتب ClassLoaders ، لذلك من الصعب القول ما مدى نطاق سوف تكون في تلك البيئة.

يمكن أن يكون classloader المشكلة حيث الجرة التي تحتوي على صفك تتكرر في كل WEB-INF/lib من مختلف التطبيقات ؟ إذا كنت تحاول إضافة هذه الجرة إلى هر يبس وليس إلى التطبيق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top