寫這篇文章的主要目的是記錄,如果能幫到一些人那也是及好的。
JDK1.5在併發包java.util.concurrent.locks中增加了新的併發編程接口Lock(以及相關實現類)。Lock提供了與synchronized關鍵字類似的同步功能,但需要在使用時手動獲取和釋放鎖。
Lock相關接口:
l void lock(): 獲取鎖,調用該方法當前線程將會獲取鎖,當鎖獲取後,該方法將返回。
l void lockInterruptibly():可中斷獲取鎖,與lock()方法不同之處在於該方法會響應中斷,即在鎖的獲取過程中可以中斷當前線程
l boolean tryLock():嘗試非阻塞的方式獲取鎖,調用該方法立即返回,獲取到鎖返回true。
l boolean tryLock(long time, TimeUnit unit):超時獲取鎖,以下情況會返回:時間內獲取到了鎖,時間內被中斷,時間到了沒有獲取到鎖。
l unlock():釋放鎖。
ReentrantLock
ReentrantLock有兩種實現方式,公平鎖和非公平鎖。默認使用的是非公平鎖。它也是可重入鎖。
可重入鎖:同一線程外層函數獲得鎖之後,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。
公平鎖與非公平鎖:
公平鎖:按獲取鎖的先後順序,誰先獲取鎖,誰先得到鎖。
非公平鎖:不管前面是否有人等待獲取鎖先獲取鎖,如果未獲取到鎖則和公平鎖一樣加入等待列表,先到先得。它的效率相對來說更高。
Lock鎖使用方法:1. 定義一個Lock對象, 2. 繼承ReentrantLock類
Lock相關類的類圖