自旋鎖:爲了避免放棄CPU執行時間,循環的使用CAS技術對數據進行嘗試更新,直至成功。數組
悲觀鎖:假定會發生併發衝突,同步全部共享數據的相關操做,從讀書據就開始上鎖。併發
樂觀鎖:假定沒有衝突,在修改數據時若是發現數據和以前獲取的不一致,則讀取最新數據,而後重試修改。優化
獨享鎖(寫):給資源加上寫鎖,線程能夠修改資源,其它線程不能再加鎖;(單寫)spa
共享鎖(讀):給資源加上讀鎖後只能讀不能改,其餘線程也只能加讀鎖,不能加寫鎖;(多讀)線程
可重入鎖、不可重入鎖:線程拿到一把鎖以後,能夠自由進入同一把鎖同步的其餘代碼,則爲可重入鎖;不然是不可重入鎖。對象
公平鎖、非公平鎖:爭搶鎖的順序,若是是按先來後到,則爲公平鎖;不然是非公平鎖。blog
Java中幾種重要的鎖的實現方式:synchronized、ReentrantLock、ReentrantReadWriteLock內存
屬於最基本的線程通訊機制,基於對象監視器實現的。資源
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構造以下圖所示: