سؤال

نظرا لوجود مشكلة قفل مزدوجة المراجعة بحيث يتعين علينا استخدام المزامنة لضمان الوصول المتزامن إلى الطريقة التالية (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 التي لا تقل عن حالها في حالتي عدة مرات.

الآثار المترتبة عند عدم استخدام متزامنة هنا:

http://en.wikipedia.org/wiki/double-checked_locking.

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

المحلول 4

أعتقد أنها وسيلة للدخان للتأكد من أنها تعمل بشكل جيد عندما تكون في وضع متعدد الخيوط، بغض النظر عما إذا كان الشخص الذي يغلب على Org.apache.struts.util.messageresources يحدد Crateresources (تكوين السلسلة) بمثابة مزامنة أم لا.

نصائح أخرى

يكون MessageResourcesFactory الخيط آمن؟ ال synchronized طريقة تحمي كل من إعداد الحقل و createResources طريقة الاتصال. إذا كان آمنا للخيط آمنا، فيمكن نقل القفل لتغطية ما عليك سوى إعداد الحقل وترك استدعاء الطريقة خارج القسم الحرج.

النفقات العامة التي تكبدتها الأساليب المتزامنة على JVM الحديثة هي صغيرة جدا لتصبح ضئيلة. ستكون المكالمات اللاحقة إلى طريقة المصنع الكسول المتزامنة - بسرعة كبيرة كما ستدعو إلى طريقة حريصة غير متجانسة.

من حيث التعليمات البرمجية، فإن نهج الكسول - هو أبسط وسهل فهم (في رأيي) من استخدام كتلة تهيئة ثابتة. أيضا، عندما تفشل كتل INIT ثابتة، يمكن أن تكون مربكة للغاية لمعرفة أين ولماذا.

ما لم يكن هناك أي سبب MessageResourceFactory لا يمكن تهيئته مبكرا (على سبيل المثال، يجب تهيئة موارد Servlet معينة أولا)، وأعتقد أنني أحب حلاك بشكل أفضل. أعتقد أنه لا يوجد سبب لفريق الدعامات لتحميل المصنع بخلاف الكذاب بخلاف هذا ما هو ما يستخدمه المطور المعين الذي عمل على ذلك في القيام به (الأشخاص الذين يميلون إلى التحميل المفروم على المكدس حتى عندما يكون ذلك ضروريا).

هل حاولت تقديم تقرير خطأ، واقتراح حلكم؟

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