Bei der sicheren Veröffentlichung geht es um Speichersichtbarkeit . Das Konzept der Speicher-Sichtbarkeit ist ein bisschen kniffliger als andere Threadsicherheitsprobleme wie Race Conditions.
Speichersichtbarkeitsprobleme treten auf, wenn Aktionen, die von einem Thread in einer bestimmten Reihenfolge ausgeführt werden, in anderer Reihenfolge für einen anderen Thread ausgeführt werden (dies kann durch Optimierungen verursacht werden, die vom Compiler oder der CPU vorgenommen werden).
In Ihrem Fall:
%Vor% Für Thread A wird n
sicherlich vor h
initialisiert.
Aber in Ermangelung einer sicheren Veröffentlichung ist es nicht garantiert, dass es für Thread B gleich ist. Thread B kann h
im initialisierten Zustand sehen, aber n
wird noch nicht initialisiert. Darüber hinaus kann sich der Zustand von n
, wie er von Thread B beobachtet wurde, während der Auswertung von n != n
ändern, was dazu führt, dass assertSanity()
eine Ausnahme auslöst.
Beachten Sie, dass dieses Problem nicht in jedem Fall garantiert ist. Sie werden wahrscheinlich nie sehen, dass dies passiert, aber Java Memory Model garantiert dennoch keine Korrektheit in diesem Fall.
Es ist nicht Thread-sicher, denn wenn das Objekt der Klasse erstellt wird, wird Holder.n
den Standardwert 0
zugewiesen.
Aus diesem Grund können einige Threads den Wert 0
und andere den Wert n
sehen, der an den Konstruktor übergeben wird.
Dieser Kurs ist in Ordnung. Wir sollten normalerweise erwarten, dass Objekte nur durch sichere Veröffentlichung zwischen Threads geteilt werden. In diesem Fall scheint Holder.n
für alle Beobachter der gleiche konstante Wert zu sein.
Das Teilen von Objekten durch unsichere Veröffentlichung ist manchmal vertretbar, jedoch muss der Programmierer dafür verantwortlich sein, sicherzustellen, dass das Objekt in dieser Situation verwendet werden kann, z. %Code%.
Die meisten Klassen müssen und sollten nicht so entworfen werden, dass sie mit unsicheren Veröffentlichungen arbeiten.
Tags und Links java multithreading concurrency