سؤال

كنت أذهب من خلال مقتطفات رمز النظر في جانب المزامنة. أعتقد أن قفل يحدث على الكائنات. في حالة Java لدينا فقط إشارات إلى الكائنات. يجب على Java استخدام الإشارة إلى شراء الكائن وقفله.

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

    synchronized (formatters) {
        if(formatters == null) {
            prepareCache(feedId);
        }
    }
هل كانت مفيدة؟

المحلول

تبعا لهذا المنتدى, والعديد من الروابط الأخرى ذات الصلة. إذا كانت النماذج فارغة، فسيتم إلقاء nullpointerException.

نصائح أخرى

تحصل على nullpointerexception. علي سبيل المثال:

class A {
    public static void main(String[] ss) {
        Object o = null;
        synchronized (o) {
        }
    }
}

يعطيك:

Exception in thread "main" java.lang.NullPointerException
    at A.main(A.java:4)

من عند البيان المتزامن القسم في مواصفات لغة Java.:

"SynchronizedStatement: synchronized ( Expression ) Block"... وإلا، إذا كانت قيمة التعبير فارغة، يتم إلقاء nullpointerException. "

SSSH، ليس من المفترض أن تعرف تلك في الواقع المراجع إلى الأشياء! فكر فيهم كما قدموا - مثل كائن - وليس كيف يتم تنفيذها. توفر فئة الكائن قفل واحد، لذلك سيكون كائن Formatters الخاص بك قد ورثه. إذا حدث الصيادون أن تكون فارغة، فستكون المزامنة على ذلك رمي nullpointerException.

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

لن يعمل. يمكنك مزامنتها أشياء, ، ليس على المتغيرات. وبعد عندما يكون المتغير فارغا، لا يوجد كائن لمزامنة التشغيل، لذلك يتم طرح استثناء.

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