鎖提供了兩種主要特性:互斥(mutual exclusion) 和可見性(visibility)。互斥即一次隻允許一個線程持有某個特定的鎖,是以可使用該特性實作對共享資料的協調通路協定,這樣,一次就隻有一個線程能夠使用該共享資料。可見性要更加複雜一些,它必須確定釋放鎖之前對共享資料做出的更改對于随後獲得該鎖的另一個線程是可見的 —— 如果沒有同步機制提供的這種可見性保證,線程看到的共享變量可能是修改前的值或不一緻的值,這将引發許多嚴重問題。
volatile修飾的成員變量在每次被線程通路時,都強迫從共享記憶體中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程将變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
java語言規範中指出:為了獲得最佳速度,允許線程儲存共享成員變量的私有拷貝,而且隻當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當多個線程同時與某個對象互動時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關鍵字就是提示vm:對于這個成員變量不能儲存它的私有拷貝,而應直接與共享成員變量互動。
使用建議:在兩個或者更多的線程通路的成員變量上使用volatile。當要通路的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了vm中必要的代碼優化,是以在效率上比較低,是以一定在必要時才使用此關鍵字。
就跟c中的一樣 禁止編譯器進行優化~~~~