多線程學習筆記(二)

1.5,5

synchronized關鍵字  

lock和condition的關鍵點:       

 1.鎖用來保護代碼片斷,任何時刻只允許一個線程執行被保護的代碼。    

  2.鎖可以管理試圖進入被保護代碼短的線程。       

3.鎖可以擁有一個或多個相關的條件對象。        

4.每個條件對象管理那些已進入被保護代碼段但還不能運行的線程。   

Condtion的await()和signalAll()方法等價於thread的wait()和notifyAll()方法

1.5.8 死鎖
        當程序掛起後,就是所有線程都掛起後,按CTRL+/,將會得到所有線程的列表。每一個線程都有一

個堆棧蹤跡,它會告訴你當前在哪裏阻塞了。

1.5.9 公平
          Lock lock = new ReentrantLock(true);//設置爲公平鎖策略。

         公平鎖策略會優待那些等待了最長時間的線程。但是,這會大大影響性能。所以默認下是非公平的。

1.5.10  鎖測試和超時

java.util.concurrent.locks.Lock 5.0

boolean tryLock()

如果鎖可用,則獲取鎖,並立即返回值 true。如果鎖不可用,則此方法將立即返回值 false

boolean tryLock(long time,TimeUnit unit)

嘗試獲得鎖,但阻塞時間不會超過給定的值;如果成功返回true;

void lockInterruptibly()

獲得鎖,但是會不確定地發生阻塞。如果線程被中斷,拋出一個InterruptedException異常。

1.5.11  讀/寫鎖

    1)創建一個ReentrantReadWriteLock 對象

     private  ReentrantReadWriteLock  rwl  =  new  ReentrantReadWriteLock ();

   2)抽取讀鎖和寫鎖

     private  Lock  readlock = rwl.readLock();

     private  Lock  writeock = rwl.writeLock();

   3)對所有訪問者加讀鎖

    public  double  getTotalBalance()

   {

   readlock.lock();

   ...................

   }

   1.6  阻塞隊列

   ConcurrentHashMap具有一些很有用地方法來進行原子行地關聯插入和關聯移出操作。

 putIfAbsent(key,value);

如果指定鍵已經不再與某個值相關聯,則將它與給定值關聯。這等價於:

   if (!map.containsKey(key)) 
      return map.put(key, value);
  else
       return map.get(key);

replace(key,oldValue,newValue);

只有目前將鍵的條目映射到給定值時,才替換該鍵的條目。這等效於:

   if (map.containsKey(key) && map.get(key).equals(oldValue)) {
       map.put(key, newValue);
       return true;
   } else return false;

1.7.3 舊的線程安全地集合

  JDK1.2中,Vector和hashtable被棄用了,雖然他們是線程安全地動態數組!

   替代它們的是ArrayList和hashMap,雖然這些不是線程安全的,但可以利用一下操作實現線程安全:

  List synchList = Collections.synchronizedList(new ArrayList());

  Map synchMap= Collections.synchronizedList(new HashMap());

但是如果你想迭代這個Collection的化,必須使用一個同步塊:

synchronized  (synchMap)

{

   Iterator iter = synchMap.keySet().iterator();

}

1.9  執行器

  1.9.1線程池




               

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章