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關鍵字也能確保數據可見性。
最後學習多線程八字真經「外練互斥,內修可見」。