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