لماذا مثيل كسول من Messageresourcesfactory في الدعامات 1.2.7؟
-
19-09-2019 - |
سؤال
نظرا لوجود مشكلة قفل مزدوجة المراجعة بحيث يتعين علينا استخدام المزامنة لضمان الوصول المتزامن إلى الطريقة التالية (ORG.apache.struts.util.messageresources الفئة):
لحسان كسول
public synchronized static MessageResources getMessageResources(String config) {
if (defaultFactory == null) {
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}
لماذا لا تستخدم:
حريصة مثيل
static {
// Construct a new instance of the specified factory class
try {
if (clazz == null)
clazz = RequestUtils.applicationClass(factoryClass);
MessageResourcesFactory defaultFactory =
(MessageResourcesFactory) clazz.newInstance();
} catch (Exception e) {
LOG.error("MessageResourcesFactory.createFactory", e);
}
}
وثم:
public static MessageResources getMessageResources(String config) {
return defaultFactory.createResources(config);
}
ومن شأنه أن يسمح بالوصول المتزامن إلى طريقة GetMessageresources التي لا تقل عن حالها في حالتي عدة مرات.
الآثار المترتبة عند عدم استخدام متزامنة هنا:
المحلول 4
أعتقد أنها وسيلة للدخان للتأكد من أنها تعمل بشكل جيد عندما تكون في وضع متعدد الخيوط، بغض النظر عما إذا كان الشخص الذي يغلب على Org.apache.struts.util.messageresources يحدد Crateresources (تكوين السلسلة) بمثابة مزامنة أم لا.
نصائح أخرى
يكون MessageResourcesFactory
الخيط آمن؟ ال synchronized
طريقة تحمي كل من إعداد الحقل و createResources
طريقة الاتصال. إذا كان آمنا للخيط آمنا، فيمكن نقل القفل لتغطية ما عليك سوى إعداد الحقل وترك استدعاء الطريقة خارج القسم الحرج.
النفقات العامة التي تكبدتها الأساليب المتزامنة على JVM الحديثة هي صغيرة جدا لتصبح ضئيلة. ستكون المكالمات اللاحقة إلى طريقة المصنع الكسول المتزامنة - بسرعة كبيرة كما ستدعو إلى طريقة حريصة غير متجانسة.
من حيث التعليمات البرمجية، فإن نهج الكسول - هو أبسط وسهل فهم (في رأيي) من استخدام كتلة تهيئة ثابتة. أيضا، عندما تفشل كتل INIT ثابتة، يمكن أن تكون مربكة للغاية لمعرفة أين ولماذا.
ما لم يكن هناك أي سبب MessageResourceFactory
لا يمكن تهيئته مبكرا (على سبيل المثال، يجب تهيئة موارد Servlet معينة أولا)، وأعتقد أنني أحب حلاك بشكل أفضل. أعتقد أنه لا يوجد سبب لفريق الدعامات لتحميل المصنع بخلاف الكذاب بخلاف هذا ما هو ما يستخدمه المطور المعين الذي عمل على ذلك في القيام به (الأشخاص الذين يميلون إلى التحميل المفروم على المكدس حتى عندما يكون ذلك ضروريا).
هل حاولت تقديم تقرير خطأ، واقتراح حلكم؟