java架構《並發線程高級篇四》
本章主要講並發線程的常見的兩種鎖。重入鎖和讀寫鎖
一:重入鎖(ReentrantLock)
概念:重入鎖,在需要進行同步的代碼加鎖,但最後一定不要忘記釋放鎖,否則會造成鎖永遠不能釋放,其他線程進不了
代碼解析:
實例化:Lock lock = new ReentrantLock();
鎖定:lock .lock();
釋放鎖:lock.unlock();
代碼:
private Lock lock = new ReentrantLock();
public void method1(){
try {
lock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入method1..");
Thread.sleep(1000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "退出method1..");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
Condition類:配合重入鎖,阻塞和通知,不需要配合synchronized使用,比較靈活,支持多個線程鎖定,同時通知全部。
阻塞和通知:
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
阻塞:condition.await();
通知:condition.signal();
通知全部:condition.signalall()
Lock/Condition其他方法和用法:
Lock lock=new ReentrantLock(boolean isFair);
tryLock():嘗試獲得鎖,返回false/true
tryLock():在給定的時間內嘗試獲得鎖,獲得結果用 true/false表示。
isFair():返回是否是公平鎖 true/false
isLocked():返回是否鎖定
getHoldCount():返回當前線程保持此鎖的個數,或者說表示調用了lock()的次數
lockinterruptibly():優先響應中斷的鎖
getQueueLength():返回正在等待獲取此鎖定的線程數。
getWaitQueueLength():返回等待與鎖定相關的給定條件Condition的線程數
hasQueueThread(Thread t):查詢指定的線程是否正在等待此鎖
hasQueueThreads():查詢是否有線程正在等待此鎖
hasWaiters():查詢是否有線程正在等待與此鎖定有關的condition條件
二:讀寫鎖(ReentrantReadWriteLock)
概念:其核心就是讀寫分離的鎖,在讀多寫少情況下,性能遠高於重入鎖 。口訣:讀讀共享,寫寫互斥,讀寫互斥
代碼解析:
實例化:
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private ReadLock readLock = rwLock.readLock(); //獲取到讀鎖
private WriteLock writeLock = rwLock.writeLock(); //獲取到寫鎖
java架構《並發線程高級篇四》