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();
}
相关文章
相关标签/搜索