Lock鎖(重點) 傳統的synchronized 傳統的解決多線程併發導致的一些問題我們會使用synchronized關鍵字來解決,synchronized的本質就是隊列、鎖。 Lock的實現類有:可重覆鎖(最常用)、讀鎖、寫鎖 在創建可重覆鎖時,可傳入boolean類型值來決定該鎖是公平鎖(先來 ...
Lock鎖(重點)
傳統的synchronized
傳統的解決多線程併發導致的一些問題我們會使用synchronized關鍵字來解決,synchronized的本質就是隊列、鎖。
Lock的實現類有:可重覆鎖(最常用)、讀鎖、寫鎖
在創建可重覆鎖時,可傳入boolean類型值來決定該鎖是公平鎖(先來後到)還是非公平鎖(可插隊)。
三部曲
1、創建一個鎖
Lock lock = new ReentrantLock(true);
2、加鎖
lock.lock();
3、將業務代碼塊包裹在try{}cath(){}finally{lock.unlock();}中
try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":賣出了第"+ number-- +"張票;"+"剩餘"+number+"張票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
完整給一個業務加鎖
class Ticket2{
private int number = 50;
Lock lock = new ReentrantLock(true);
public void sale(){
lock.lock();
try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":賣出了第"+ number-- +"張票;"+"剩餘"+number+"張票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
公平鎖結果
非公平鎖結果
從結果上看,非公平鎖和synchronized關鍵字效果一樣。
- 小知識:for迴圈中的業務邏輯只有一條的時候可以簡化大括弧,直接將業務邏輯卸載後面通過分號結束。
synchronized和Lock鎖的區別
- synchronized是關鍵字,Lock鎖是java的一個類
- synchronized無法判斷鎖的狀態,Lock鎖可以判斷是否獲取到了鎖
- synchronized是自動的,執行完之後會自動釋放鎖;Lock鎖必須要手動釋放鎖!如果不釋放鎖,會導致死鎖
- synchronized 線程1(獲得鎖,阻塞)、線程2(等待,傻等死等);Lock鎖在其他線程獲得鎖阻塞後不一定會一直等待下去。可以通過tryLock來嘗試獲得鎖。
- synchronized 可重入鎖,不可以中斷,非公平鎖;Lock 可重入鎖,可以判斷鎖、可以自己設置是否公平
- synchronized 適合鎖少量的代碼同步問題;Lock 適合鎖大量的代碼同步