Java基礎學習總結(154)——Synchronized與Volatile、Synchronized與ReentrantLock概念及區別

一、Synchronized與Volatile的區別

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

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