Java中volatile關鍵字原義是“不穩定、變化”的意思,那麼在java語言中,volatile是什麼意思呢?
volatile,在Java中用來修飾變量,那是爲什麼呢?volatile是告訴vm,這個變量不能被私自佔有使用,下面就解釋一下爲什麼這麼說吧!
大家都知道,在java中,除了long和double的操作,對基本類型的操作是原子性的,那還爲什麼使用valotile關鍵字呢,因爲隨着jvm的優化和成熟,爲了提高多線程的效率,允許每個線程在工作內存保存變量的拷貝進行操作,這就很容易出現數據不一致,所以volatile就強制是多核或多線程必須從主存中讀寫變量,保證變量的一致性。
由於比起synchronized,volatile關鍵字的覆蓋範偉更小,只是修飾的變量,所以效率就比前者高,但是,它是存在問題的,不能保證“線程寫的合理”,解釋如下:
寫的不合理,是可能存在競爭條件,而出現操作與設想結果不同。
假如,有100個線程正在對一個i變量驚醒i++操作,那麼結果一定是100麼,可能<100的,比如一個線程a讀到的是i=3,幾乎同時(a沒有修改i),另一個線程也讀到3,那麼結果,兩次相加就得到了i=4,而不是5,詳細看看操作系統同步就知道了。
怎麼處理呢?
1.使用synchronized關鍵字,但是這樣就失去了volatile的意義。
2.使用CPU原語實現非阻塞算法。
http://blog.csdn.net/weizhaozhe/archive/2009/02/21/3919161.aspx