Lock介面與物件
Lock lock = new ReentrantLock();
用介面使用一個物件,達到執行緒同步化
Lock lock = new ReentrantLock();
Thread t1 = new Thread() {
public void run() {
try {
log("執行緒啟動");
log("試圖佔有物件:lock");
lock.lock();//佔有物件
log("佔有物件:lock");
log("進行5秒的業務操作");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
log("釋放物件:lock");
lock.unlock();//釋放物件
}
log("執行緒結束");
}
};
t1.setName("t1");
t1.start();
————————————————————————————————————————————————————————
tryLock
Lock lock = new ReentrantLock();
Thread t1 = new Thread() {
public void run() {
boolean locked = false;
try {
log("執行緒啟動");
log("試圖佔有物件:lock");
locked = lock.tryLock(1,TimeUnit.SECONDS);
if(locked){
log("佔有物件:lock");
log("進行5秒的業務操作");
Thread.sleep(5000);//這5s因為自身lock無法讓出cpu,5s之後unlock
}
else{
log("經過1秒鐘的努力,還沒有佔有物件,放棄佔有");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(locked){//不同處,需要進行判斷
log("釋放物件:lock");
lock.unlock();
}
}
log("執行緒結束");
}
};
t1.setName("t1");
t1.start();
————————————————————————————————————————————————————————
Condition condition = lock.newCondition();
condition.await();
condition.signal();
1. Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現,Lock是程式碼層面的實現。
2. Lock可以選擇性的獲取鎖,如果一段時間獲取不到,可以放棄。synchronized不行,會一根筋一直獲取下去。 藉助Lock的這個特性,就能夠規避死鎖,synchronized必須通過謹慎和良好的設計,才能減少死鎖的發生。
3. synchronized在發生異常和同步塊結束的時候,會自動釋放鎖。而Lock必須手動釋放, 所以如果忘記了釋放鎖,一樣會造成死鎖。