黑馬程式設計師 – 學習Java5執行緒併發庫(5) -- 2013.1.3
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------
今天學習了鎖,Lock比傳統執行緒模型中的synchronized方式更加面向物件,與生活中的鎖類似。接觸到讀寫鎖,分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖和寫鎖互斥,寫鎖與寫鎖互斥。
讀寫鎖的一個應用:設計一個快取系統
下面是我按照老師的思路寫的程式碼:
packagecn.itcast;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.concurrent.locks.ReadWriteLock;
importjava.util.concurrent.locks.ReentrantReadWriteLock;
/*
* 讀寫鎖的應用:設計一個快取系統
* 多個執行緒讀不互斥,但是讀寫互斥,寫寫互斥
*/
publicclass CacheDemo {
private Map<String, Object> cacheData= new HashMap<String, Object>();
public static void main(String[] args) {
}
private Object value = null;
private ReadWriteLock rwl = newReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock();
try {
value = cacheData.get(key);
if(value == null){
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if(value==null) //重複檢查value狀態,因為可能多個執行緒會訪問到此處。
value ="aaa"; //實際去queryDB
} finally {
rwl.readLock().lock();
rwl.writeLock().unlock(); //在釋放寫鎖之前上讀鎖
}
}
} finally {
rwl.readLock().unlock();
}
return value;
}
}
接觸到Condition,condition的功能類似在傳統執行緒技術中的Object.wait和Object.notify的功能。不同的是一個鎖內部可以有多個condition。JDK condition文件中有一個實現阻塞佇列的例子,裡面就使用了多個condition。
多個condition的另一個應用:實現三個執行緒輪流執行(通訊)。即讓主執行緒先執行,子執行緒1接著執行,然後子執行緒2執行。這裡就不附加程式碼了。
學習了Semaphore同步工具和CyclicBarrier同步工具。使用Semaphore可以控制同時訪問資源的執行緒個數。單個Semaphore物件可以實現互斥鎖的功能,並且可以是由一個執行緒獲得了鎖,再由另一個執行緒來釋放鎖,可應用於恢復死鎖的一些場合。CyclicBarrier表示大家彼此等待,大家集合好了後才開始出發,分散活動後又在指定地點集合碰面。