NullPointerException bei synchronisierter Anweisung

8

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.

    
Kai 22.06.2011, 00:17
quelle

4 Antworten

26

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:

%Vor%

Da sich lockObj niemals ändert, verwenden Sie immer die gleiche Sperre - keine Probleme.

    
bdonlan 22.06.2011, 00:23
quelle
6

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.

    
Daniel 22.06.2011 00:23
quelle
1

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.

    
Thilo 22.06.2011 00:22
quelle
0

Erstellen Sie ein privates Objektklassenmitglied, das keine öffentlichen Setter hat und sperren Sie das.

    
Marcus Leon 22.06.2011 00:23
quelle

Tags und Links