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.