1. 程式人生 > >黑馬程式設計師 – 學習Java5執行緒併發庫(5) -- 2013.1.3

黑馬程式設計師 – 學習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表示大家彼此等待,大家集合好了後才開始出發,分散活動後又在指定地點集合碰面。