標籤:
ReentrantLock和synchronized的選擇
1 synchronized的弊端,簡化了代碼工作,並且與異常處理操作實現了很好的互動,但是表現不夠靈活,對線程式控制制較小,比如無法中斷等待的線程,或者無法在請求擷取鎖時無限的等待,也沒法實現非阻塞結構的加鎖規則。
2 reentrantlock, java5.0以後才引入,實現了Lock 介面,提供了與synchronized相同的互斥性和記憶體可見度。在java5.0裡面效能優勢比內建鎖明顯,java6.0裡面差不多,是內建鎖的補充,不是替代,
public interfance Lock{
void lock();
void lockInterruptibly() throws InterruptedException;//可中斷的所擷取操作
boolean tryLock();//輪詢鎖,避免死結的發生
boolean tryLock(Long timeout, TimeUnit unit);//定時鎖,避免死結的發生
void unlock();
Condition newCondition();
}
使用標準
Lock lock = new reentrantLock()
......
lock.lock();
try{
}catch(){
//執行更新操作
}finally{
lock.unlock();
}
tryLock,比如同時需要擷取兩個對象的鎖才能開始執行業務,
if(alock.tryLock())
try{
if(block.tryLock())
try{
//執行業務操作
}catch{
}finally{
block.unlock();
}
}catch{
}finally{
alock.unlock();
}
3 reentrantReadWriteLock 讀寫鎖,一個資源可以被多個讀操作訪問,或者被一個寫操作訪問,但兩者不能同時進行。他允許多個執行讀操作的線程訪問資料結構,能有效提高程式效能。
pubilc interface ReadWriteLock(){
Lock readLock();
Lock writeLovk();}
基於讀寫鎖封裝map:
public class ReadWriteMap{
private final Map<K,V> map;
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();
public ReadWriteMap(Map<K,V> map){
this.map=map;
}
public V put(K key,V value){
w.lock();
try{
return map.put(key,value);
}catch{
}finally{
w.unlock();
}
public V get(K key){
r.lock();
try{
return get(key)
}catch{
}finally{
r.unlock();
}
}
java 多線程知識梳理2