關於java多線程關鍵字volatile的理解

volatile關鍵字的做用是強制從公共堆棧中取得變量的值,而不是從線程私有數據棧中取得變量的值。java

使用volition關鍵字增長了實例變量在多個線程間的可見性。但volition有個致命的缺點就是不支持原子性安全

下面將volition和synchronized關鍵字進行一下比較:多線程

1.volition是線程同步間的輕量級實現,因此volition性能確定比synchronized性能好,volition只能修飾變量。性能

2.多線程訪問volition不會發生阻塞,而synchronized會阻塞。學習

3.volition能保證數據的可見性,而不能保證原子性;而synchronized既能夠保證原子性,也能夠間接保證可見性。spa

4.再次強調,關鍵字volition解決的是變量在多個線程之間的可見性;而synchronized關鍵字解決的是多個線程之間訪問資源的同步性。線程

 

線程安全包含原子性和可見性兩個方面,java的同步機制都是圍繞這兩個方面來卻保線程安全的。blog

 

關鍵字volition主要使用的場合是在多個線程中能夠感知共享變量被更改了,而且能夠得到最新的值使用,也就是用多線程讀取共享變量能夠獲取最新值使用內存

關鍵字volition提示線程每次從共享內存中讀取變量,而不是從私有內存中讀取,這樣保證了數據的可見性。資源

可是要注意,若是代碼中有i++,也就是i=i+1時,這樣的操做不是一個原子操做,也就是時非線程安全的。具體能夠了解下i++的實際意義;

①從內存中讀取變量i

②計算i的值

③將i的值寫到內存中

加如兩個線程同時執行到這段代碼,那有可能就會出現髒數據,解決辦法就是加synchronized字。

其實除了用synchronized,還能夠用原子類解決。

這樣能夠代替i++,還不要加同步鎖。

另外要說下synchronized關鍵字也能確保數據可見性。

最後學習多線程八字真經「外練互斥,內修可見」。

相關文章
相關標籤/搜索