java memória modell és atomicitás műveletek (java memória modell)
Előfordul, hogy néha pochityvayu különböző érdekes könyvet. Itt például, saját fejlődésük bármely JSR olvasni :). A legutóbbi - nézegette a JSR-133 Java memória modell és téma Specification (Java memória modell).
Ebben a cikkben szeretnék, hogy ismét azt mutatják, hogy fontos a szálszinkronizációt egy példát egy ilyen dolog, mint atomos (Atomicity) műveleteket.
Tekintsük a következő kódot:
Megállapítottam, változó illékony módosítót, hogy minden szál mindig lehet látni a megfelelő változó.
Amikor fut a képernyő jelenik meg a számok 0 és 1 Természetesen, mivel a változó értékét az i áram váltakozva növelik vagy csökkentik.
Tény, hogy a System.out fog megjelenni valami ilyesmit:
Tehát mi a helyzet?
És az a helyzet, hogy a növelő és csökkentő operátorok nem atomi. Szekvenciálisan olvasás történik, a növekedés / csökkenés értékét és további felvételt.
Helyes egy hiba a kód segítségével a szinkronizált blokk:
Atomicity osztály szinkronizálás azt mondja, hogy egy időben a szinkronizált blokk található, nem több, mint egy patak. Más szálak fog várni, hogy elfog a monitor Atomicity osztályban. Hogy mi fog történni csak az aktív szál szabadítja fel a monitoron.
Kijavítása után, és indítsa osztály a konzol a következőket láthatjuk:
Atomicity azt mondja, hogy bizonyos intézkedéseket (vagy szekvenciát) kell történnie „egyszerre”. Osutstvie szinkronizálás vezethet katasztrofális következményekkel jár. Ez nem a NullPointerException, ami azonnal érzékelni lehet. A program a munka hosszú ideig, és vizaulno nincs probléma nem lesz megtalálható.
Írásakor többszálas alkalmazások óvatosnak kell lenni, hogy kövesse az összes lehetséges események nem atomi hibákat.
És még egy nagyon fontos pont - összhangban a Java memória modell bejegyzés egy változó típusú hosszú és dupla nincs atomi. A típusok hosszú és dupla 64-bites és tekintik atomi csak azok a rekordok az egyes 32 bites részt. Ez ahhoz vezethet, hogy az a tény, hogy egyes fluxus lát egy része az érték a frissített és a második sem.
Annak érdekében, hogy atomicitás rekord hosszú és dupla akkor nyilvánítja illékony.
By the way, a felvétel egy objektum referenciát (referencia) mindig atom, függetlenül attól, hogy van dolgunk 32 bites vagy 64 bites végrehajtását JVM.
A Java memória modell beszélt sokkal érdekesebb dolgokat, mint például a láthatóság (re) és a rend (megrendelés). De ez egy másik történet.