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(); }