標籤:獲得 調用 之一 設計 寫鎖 java read 反轉 輕量級
1.可重新進入鎖
synchronized和Lock都是可重新進入鎖
表明了鎖的分配機制是基於線程,而不是基於方法
例如,在一個同步方法中調用了另一個同步方法,再進入第二個同步方法時,不需要重新申請鎖
2.可中斷鎖
synchronized是不可中斷的。
一個線程已經獲得了某對象的鎖,另一個線程想獲得該對象的鎖時,必須等待,直到第一個線程釋放鎖(執行完、異常)
Lock調用lockInterruptibly方法獲得鎖時,是可中斷的。
一個線程已經獲得了某對象的鎖,另一個線程想獲得該對象的鎖時,等待,在等待過程中,可以調用該線程的interrupt方法終端等待
3.公平鎖、非公平鎖
公平鎖:按照請求的順序獲得鎖
非公平鎖:不保證擷取鎖的順序,輸送量高,造成優先順序反轉或者饑餓現象(有的線程一直等待)
synchronized是非公平鎖
Lock的實作類別:ReentrantLock它預設情況下是非公平鎖,在建立相應對象時,使用重載的構造器,傳入參數(true),設定成公平鎖
4.共用鎖定、排它鎖
共用鎖定:鎖可以被多個線程持有
排它鎖:鎖只能被一個線程持有
synchronized和Lock都是排它鎖
ReadWriteLock(讀寫鎖),其讀鎖是共用鎖定,寫鎖是排它鎖
實作類別ReentrantReadWriteLock
5.樂觀鎖、悲觀鎖
樂觀鎖:對同一資料的並行作業,樂觀地認為不會發生修改,在更新資料的時候,嘗試更新(版本)
悲觀鎖:對同一資料的並行作業,悲觀地認為一定會發生修改,加鎖
樂觀鎖:CAS
6.分段鎖
分段鎖是一種鎖的設計(ConcurrentHashMap)
7.偏向鎖/輕量級鎖/重量級鎖
jdk1.5引入的鎖定擴大機制,實現高效的synchronized
偏向鎖:若同步代碼之一被一個線程訪問,則該線程自動擷取鎖
輕量級鎖:鎖是偏向鎖時,另一線程訪問同步代碼,偏向鎖上升為輕量級鎖,另一線程採用自旋形式擷取鎖,不會阻塞
重量級鎖,鎖是輕量級鎖時,另一線程自旋一定次數之後仍未獲得鎖,阻塞,輕量級鎖上升為重量級鎖
8.自旋鎖
嘗試獲得鎖的線程不會立即阻塞,而是採用迴圈的方式嘗試擷取鎖,減少環境切換的消耗,但是迴圈會消耗CPU
Java中的鎖