Java >> Java tutorial >  >> Tag >> volatile

Opstår flygtig læsning - før flygtig skrivning?

Er 1 sker-før 2, hvorfor?

Jeg er ikke 100 % sikker på, at jeg forstår dit spørgsmål.

Hvis du har en flygtig variabel a og en tråd læser fra den, og en anden skriver til den, kan rækkefølgen af ​​disse adgange være i enten bestille. Det er en race tilstand. Hvad der garanteres af JVM og Java Memory Model (JMM) afhænger af, hvilken handling der sker først.

Skrivningen kunne lige være sket, og læsningen ser den opdaterede værdi. Eller skrivningen kunne ske efter læsningen. Så x kunne være enten 5 eller den tidligere værdi af a .

hver sekventiel konsistensudførelse skal være sker-før-relation mellem disse adgange

Jeg er ikke sikker på, hvad det betyder, så jeg vil prøve at være specifik. "Happens before relation" med volatile betyder, at al tidligere hukommelse skriver til en volatile variabel forud for en læsning af den samme variabel er garanteret afsluttet. Men denne garanti forklarer på ingen måde timingen mellem de to volatile operationer, der er underlagt løbsbetingelserne. Læseren har garanteret set skrivningen, men kun hvis skrivningen skete før læsningen.

Du tror måske, at dette er en ret svag garanti, men i tråde, hvis ydeevne er dramatisk forbedret ved at bruge lokal CPU-cache, kan læsning af værdien af ​​et felt komme fra et cachelagret hukommelsessegment i stedet for central hukommelse. Garantien er afgørende for at sikre, at den lokale trådhukommelse er ugyldig og opdateret, når en volatile læsning sker, så tråde kan dele data korrekt.

Igen garanterer JVM og JMM, at hvis du læser fra en volatile felt a , så enhver skrivning til det samme felt, der er foregået før læst, vil blive set af det -- værdien skrevet vil blive korrekt offentliggjort og synlig for læsetråden. Denne garanti afgør dog på ingen måde bestillingen. Der står ikke, at skrivningen skal ske før læsningen.


Nej, en flygtig læsning før (i synkroniseringsrækkefølge) en flygtig skrivning af den samme variabel skeder-før nødvendigvis den flygtige skrive.

Det betyder, at de kan være i et "datakapløb", fordi de er "modstridende adgange, der ikke er bestilt af et sker-før-forhold". Hvis det er rigtigt, indeholder stort set alle programmer dataløb:) Men det er nok en spec-fejl. En flygtig læsning og skrivning bør aldrig betragtes som et dataræs. Hvis alle variabler i et program er flygtige, er alle eksekveringer trivielt sekventielt konsistente. se http://cs.oswego.edu/pipermail/concurrency-interest/2012-January/008927.html


Java tag