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線程池