modelul de memorie java și atomicității operații (modelul de memorie java)

Se întâmplă că, uneori, pochityvayu diferite cărți interesante. Aici, de exemplu, pentru propria lor dezvoltare orice JSR citit :). De la recenta - privind prin JSR-133 Java de memorie Modelul și Specification fir (modelul de memorie Java).

În acest articol, vreau să arăt încă o dată importanța sincronizării firului, un exemplu de un astfel de lucru ca operațiunile de Atomicitate (atomicitatea).

Luați în considerare următorul cod:

Am declarat o variabilă cu modificator volatil pentru a se asigura că toate firele vor vedea întotdeauna variabila cea mai relevantă.

Când rula pe ecran va fi afișat numerele 0 și 1. Desigur, din moment ce valoarea variabilei i în fluxul alternativ incrementat și decrementat.

De fapt, la System.out va fi afișat ceva de genul:

Deci, care-i treaba?

Și lucru este că operatorii de creștere și decrement nu sunt atomice. Secvențial lectură are loc, valoarea creștere / descreștere și înregistrarea ulterioară.

Corecta o eroare în codul ajută blocul de sincronizare:

Atomicitate de clasa de sincronizare spune ca la un moment dat în blocul sincronizat nu se află mai mult de un flux. Alte fire va aștepta pentru a captura clasa monitorului Atomicitate. La ce se va întâmpla numai după ce firul activ eliberează monitorul.

După corectarea și începe clasa în consola vom vedea următoarele:

Atomicitate spune că ar trebui să apară o acțiune (sau secvență) „dintr-o dată“. Sincronizarea Osutstvie poate duce la consecințe dezastruoase. Acest lucru nu este NullPointerException, care poate fi detectat imediat. Programul poate lucra pentru o lungă perioadă de timp și vizaulno probleme nu va fi găsit.

Când scrieți aplicații filetata multiple trebuie să fie atent să urmeze toate posibilele incidente de greșeli non-atomice.

Și un alt punct foarte important - în conformitate cu intrarea Java de memorie model într-o variabilă de tip lung și dublu nu sunt atomice. Tipurile lungi și duble sunt pe 64 de biți și sunt considerate a fi atomice numai înregistrările pentru fiecare parte pe 32 de biți. Acest lucru poate duce la faptul că unele flux vede o parte din valoarea actualizată și a doua încă.

Pentru a asigura înregistrarea Atomicitate în lung și dubla trebuie să-l declare ca volatile.

Apropo, înregistrarea unui obiect de referință (de referință) întotdeauna atomică, indiferent dacă avem de-a face cu punerea în aplicare pe 32 de biți sau 64 de biți JVM.

Memory Modelul Java a vorbit lucruri mult mai interesante, cum ar fi vizibilitatea (vizibilitate) și ordine (comandă). Dar asta e altă poveste.