java中關鍵字volatile


1.用在多線程同步變量時, 線程為了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實訪問的是B。只在某些動作時才進行A和B的同步。因此存在A和B不一致的情況。volatile就是用來避免這種情況的。volatile告訴jvm, 它所修飾的變量不保留拷貝,直接訪問主內存中的(也就是上面說的A) 

2.在Java內存模型中,有main memory,每個線程也有自己的memory (例如寄存器)。為了性能,一個線程會在自己的memory中保持要訪問的變量的副本。這樣就會出現同一個變量在某個瞬    間,在一個線程的memory中的值可能與另外一個線程memory中的值,或者main memory中的值不一致的情況。 

一個變量聲明為volatile,就意味着這個變量是隨時會被其他線程修改的,因此不能將它cache在線程memory中。

3.Volatile一般情況下不能代替sychronized,因為volatile不能保證操作的原子性,即使只是i++,實際上也是由多個原子操作組成:read i; inc; write i,假如多個線程同時執行i++,volatile只    能保證他們操作的i是同一塊內存,但依然可能出現寫入臟數據的情況。如果配合Java 5增加的atomic wrapper classes,對它們的increase之類的操作就不需要sychronized。

4.volatile關鍵字用於聲明簡單類型變量,如int、float、 boolean等數據類型。如果這些簡單數據類型聲明為volatile,對它們的操作就會變成原子級別的。

5.在使用volatile關鍵字時要慎重,並不是只要簡單類型變量使用volatile修飾,對這個變量的所有操作都是原子操作,當變量的值由自身的上一個決定時,如n=n+1、n++ 等,volatile關鍵字將失效,只有當變量的值和自身上一個值無關時對該變量的操作才是原子級別的,如n = m + 1,這個就是原級別的。

 

 

來源:http://sakyone.iteye.com/blog/668091

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM