Java鎖相關及synchronized關鍵字

Java中鎖的概念

自旋鎖:爲了避免放棄CPU執行時間,循環的使用CAS技術對數據進行嘗試更新,直至成功。數組

悲觀鎖:假定會發生併發衝突,同步全部共享數據的相關操做,從讀書據就開始上鎖。併發

樂觀鎖:假定沒有衝突,在修改數據時若是發現數據和以前獲取的不一致,則讀取最新數據,而後重試修改。優化

獨享鎖(寫):給資源加上寫鎖,線程能夠修改資源,其它線程不能再加鎖;(單寫)spa

共享鎖(讀):給資源加上讀鎖後只能讀不能改,其餘線程也只能加讀鎖,不能加寫鎖;(多讀)線程

可重入鎖、不可重入鎖:線程拿到一把鎖以後,能夠自由進入同一把鎖同步的其餘代碼,則爲可重入鎖;不然是不可重入鎖。對象

公平鎖、非公平鎖:爭搶鎖的順序,若是是按先來後到,則爲公平鎖;不然是非公平鎖。blog

 

Java中幾種重要的鎖的實現方式:synchronized、ReentrantLock、ReentrantReadWriteLock內存

 

同步關鍵字synchronized

屬於最基本的線程通訊機制,基於對象監視器實現的。資源

Java中的每一個對象都與一個監視器相關聯,一個線程能夠鎖定或解鎖監視器。同步

一次只有一個線程能夠鎖定監視器。

試圖鎖定該監視器的其餘線程都會被阻塞,直到他們能夠得到該監視器上的鎖定爲止。

特性:可重入、獨享鎖、悲觀鎖

 

鎖的範圍:類鎖、對象鎖

JVM優化:鎖消除、鎖粗化

提示:同步關鍵字,不只是實現同步,根據JVM規範還能保證可見性(讀取最新內存數據,結束後寫入主內存)

 

同步關鍵字加鎖原理:

Java對象頭:

  若是對象是數組類型,則虛擬機用3個Word(字寬)存儲對象頭,若是對象是非數組類型,則用2字寬存儲對象頭。在32位虛擬機中,一字寬等於四字節,即32bit。

運行期Mark World 根據鎖的不一樣狀態而可能的存儲結構以下圖:

    對象mark word裏面 包含四種狀態tag( 00 01 10 11 )
    01 無鎖    00 輕量鎖     10 重量鎖    11 GC廢棄

 

 

 同步關鍵字,優化內容(JDK1.6以後,即鎖的升級過程):

  1.偏向鎖,JVM默認開啓,可使用參數關閉(減小在無競爭狀況,JVM資源消耗)

  2.出現兩個及以上的線程爭搶,則升級——>輕量級鎖(CAS修改狀態)
  3.線程CAS自旋必定次數以後,升級爲重量級鎖(對象的mark word 內部會保存一個監視器鎖的一個地址)

鎖升級過程示意圖以下:

偏向鎖示意圖:

輕量級鎖示意圖:

重量級鎖示意圖:

Monitor構造以下圖所示:

 

相關文章
相關標籤/搜索