violate

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

 

http://space.itpub.net/111631/viewspace-610344

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章