volatile

進來做了些併發方面的東西,用了下volatile,便做了如下的小結,以便日後查用。

1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。

2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的 

3.volatile僅能實現變量的修改可見性,並能保證原子性;而synchronized則可以保證變量的修改可見性和原子性

4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。 

5.volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化


6.volatile可能會屏蔽到jvm中的一些必要的優化代碼,導致效率不是很高,所以不是特殊的要求一般不建議使用。


7.當一個變量被聲明成 volatile,任何對該變量的寫操作都會繞過高速緩存,直接寫入主內存,而任何對
該變量的讀取也都繞過高速緩存,直接取自主內存。這表示所有線程在任何時候看到的 volatile 變
量值都相同。


8.這說明n=n+1不是原子級別的操作。原因是聲明爲volatile的簡單變量如果當前值由該變量以前的值相關,那麼volatile關鍵字不起作用,也就是說如下的表達式都不是原子操作:
n  =  n  +   1 ;
n ++ ;


9、如n=n+1、n++ 等,volatile關鍵字將失效,只有當變量的值和自身上一個值無關時對該變量的操作纔是原子級別的,如n = m + 1,這個就是原級別的。所以在使用volatile關鍵時一定要謹慎,如果自己沒有把握,可以使用synchronized來代替volatile。

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