一、Synchronized與Volatile的區別
首先需要理解線程安全的兩個方面:執行控制和內存可見。執行控制的目的是控制代碼執行(順序)及是否可以併發執行。內存可見控制的是線程執行結果在內存中對其它線程的可見性。根據JVM的內存模型的實現,線程在具體執行時,會先拷貝主存數據到線程本地(CPU緩存),操作完成後再把結果從線程本地刷到主存。synchronized
關鍵字解決的是執行控制的問題,它會阻止其它線程獲取當前對象的監控鎖,這樣就使得當前對象中被synchronized
關鍵字保護的代碼塊無法被其它線程訪問,也就無法併發執行。更重要的是,synchronized
還會創建一個內存屏障,內存屏障指令保證了所有CPU操作結果都會直接刷到主存中,從而保證了操作的內存可見性,同時也使得先獲得這個鎖的線程的所有操作,都happens-before於隨後獲得這個鎖的線程的操作。volatile
關鍵字解決的是內存可見性的問題,會使得所有對volatile
變量的讀寫都會直接刷到主存,即保證了變量的可見性。這樣就能滿足一些對變量可見性有要求而對讀取順序沒有要求的需求。使用volatile
關鍵字僅能實現對原始變量