Ich habe versucht, auf ein Objekt in meinem Code unten zu synchronisieren:
%Vor%Der Code wird in einem Thread ausgeführt. Das Problem ist, dass ein anderer Thread 'globalObj' auf null setzen kann. Dann wird 'synchronized (globalObj)' NullPointerxception auslösen, wenn 'globalObj' von anderen Threads auf null gesetzt wurde.
Wie empfiehlt es sich, ein Objekt zu synchronisieren, damit NullPointerException nicht ausgelöst wird?
Danke.
Sie sollten nicht auf eine Referenz synchronisieren, die selbst geändert werden kann. Wenn ein anderer Thread globalObj
ersetzen darf, bedeutet das, dass du eine Sperre für die alte globalObj
halten kannst, während ein anderer Thread für eine völlig andere arbeitet - die Sperre hilft dir überhaupt nicht.
Was Sie stattdessen tun sollten, ist ein separates Object
für diesen Zweck:
Da sich lockObj
niemals ändert, verwenden Sie immer die gleiche Sperre - keine Probleme.
Sie können nicht auf eine null
Referenz synchronisieren. Die beste Vorgehensweise besteht darin, auf ein final
-Objekt zu synchronisieren (um sicherzustellen, dass es nie null
ist) oder (noch besser) die Abstraktionen höherer Parallelität in den java.util.concurrent
-Paketen zu verwenden.
Stellen Sie sicher, dass Sie ein Objekt synchronisieren, das nicht null sein darf ...
Warum setzen Sie globalObj
auf null? Was sollte die Nebenläufigkeitssemantik dafür sein? Ist es zufällig?
Wenn die Notwendigkeit zum Sperren manchmal wegfällt (scheint seltsam, obwohl), können Sie einen Null-Check hinzufügen (natürlich müssten Sie auf etwas anderes synchronisieren, um eine Race-Bedingung der ersten Überprüfung auf Null zu vermeiden, und dann haben gleich danach auf null gesetzt).
Bitte beschreiben Sie Ihr Szenario genauer.
Erstellen Sie ein privates Objektklassenmitglied, das keine öffentlichen Setter hat und sperren Sie das.
Tags und Links java