NullPointerException auf synchronized-Anweisung
Habe ich versucht zu synchronisieren, die auf ein Objekt in meiner folgenden code:
public void myMethod() {
synchronized (globalObj) {
//Do something here
}
}
Wird der code ausgeführt, in einem thread. Das Problem ist, dass ein anderer thread kann set 'globalObj' auf null. Dann " synchronisiert (globalObj)' werfen NullPointerxception wenn 'globalObj' wurde auf null gesetzt, die von anderen threads.
Was ist die best practice zur Synchronisierung auf ein Objekt, so NullPointerException nicht geworfen werden?
Dank.
- Mehr code bitte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie sich nicht synchronisieren Sie auf eine Referenz, die selbst verändert werden kann. Wenn ein anderer thread erlaubt ist, zu ersetzen
globalObj
, das bedeutet, dass Sie vielleicht halten eine Sperre auf den altenglobalObj
während ein anderer thread auf eine völlig andere - die Sperre nicht Sie überhaupt helfen.Was man stattdessen tun sollte, ist über einen separaten
Object
für diesen Zweck:Seit
lockObj
ändert sich nie, Sie werden immer den gleichen lock - keine Probleme.Können Sie nicht synchronisieren
null
Referenz. Die beste Vorgehensweise ist, synchronisieren sichfinal
Objekt (um sicherzustellen, dass es nienull
), oder (besser noch) die höhere Ebene von Parallelität Abstraktionen in derjava.util.concurrent
Pakete.Stellen Sie sicher, dass Sie synchronisieren Sie Sie auf ein Objekt, das nicht null sein darf...
Warum sind Sie Einstellung der
globalObj
auf null? Was sollte die Parallelität Semantik für diese? Ist es Zufall?Wenn die Notwendigkeit der Sperre geht manchmal (scheint seltsam, obwohl), können Sie ein null-check (natürlich, Sie würden synchronisieren müssen sich auf etwas anderes zu vermeiden, eine race-Bedingung der ersten überprüfung auf null, und dann, nachdem es auf null setzen unmittelbar danach).
Bitte beschreiben Sie Ihr Szenario, in mehr detail.
Erstellen Sie ein eigenes Objekt der Klasse, die keinen öffentlichen setter und Schloss auf.