Java同步Lock,Condition使用

public interface Lock
Lock 實現提供了比使用 synchronized 方法和語句可得到的更普遍的鎖定操做。此實現容許更靈活的結構,能夠具備差異很大的屬性,能夠支持多個相關的 Condition 對象。


鎖是控制多個線程對共享資源進行訪問的工具。一般,鎖提供了對共享資源的獨佔訪問。一次只能有一個線程得到鎖,對共享資源的全部訪問都須要首先得到鎖。不過,某些鎖可能容許對共享資源併發訪問,如 ReadWriteLock 的讀取鎖。


synchronized 方法或語句的使用提供了對與每一個對象相關的隱式監視器鎖的訪問,但卻強制全部鎖獲取和釋放均要出如今一個塊結構中:當獲取了多個鎖時,它們必須以相反的順序釋放,且必須在與全部鎖被獲取時相同的詞法範圍內釋放全部鎖。


Lock是一個接口, 實現則有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock, 如今就以ReentrantLock爲列.


ReentrantLock:一個可重入的互斥鎖 Lock,它具備與使用 synchronized 方法和語句所訪問的隱式監視器鎖相同的一些基本行爲和語義,但功能更強大。使用 lock 塊來調用 try,在以前/以後的構造中,lock.unlock()必須在finally釋放, 列子以下: java


//可重入鎖
	final Lock lock = new ReentrantLock();
	//Condition 鎖的控制器
	final Condition empty = lock.newCondition(); 

	public Map<String, ObjectNode> getBaseInfoMap(Integer typeid) {
		lock.lock();
		Map<String, ObjectNode> basicInfo = null;
		try{
			while(MapUtils.isEmpty(basicInfo = baseInfoMap.get(typeid))){
				//wait
				empty.await();
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//unlock
			lock.unlock();
		}
		return basicInfo;
	}

當其餘線程往 baseInfoMap 寫入數據後則調用 empty.signalAll()釋放上面代碼中等待的全部線程. 併發

lock.lock();
try {
    Map<Integer, Map<String, ObjectNode>> basicInfoNew = ...;
    baseInfoMap.putAll(basicInfoNew);
    empty.signalAll();
} finally {
    lock.unlock();
}
相關文章
相關標籤/搜索