yuyee

          ReentrantReadWriteLock讀寫(xiě)鎖

          public class ReentrantReadWriteLock extends Object implements Object implements ReadWriteLock, Serializable
          1.可重入,可重入的意思當(dāng)前線程已獲該鎖,還可以再獲取,但是讀寫(xiě)鎖里,WriteLock可以獲取ReadLock,但是ReadLock不能獲取WriteLock
          2.WriteLock可以降級(jí)為ReadLock,意思是:先獲取WriteLock,在獲取ReadLock,釋放WriteLock,這時(shí)候線程就將keep ReadLock,但是如果ReadLock想要升級(jí)為WriteLock,則不可能,因?yàn)楦鶕?jù)讀寫(xiě)鎖的可重入特性,ReadLock排斥所有WriteLock,也就是(1)特性
          3.ReadLock可以被多個(gè)線程持有并在作用時(shí)排斥任何WriteLock,而WriteLock隔離性比ReadLock高,它是完全的排斥,根據(jù)這一特性,讀寫(xiě)鎖適合高頻率讀,但不適合高頻率寫(xiě)
          4.不管是ReadLock,WriteLock都支持Interrupt
          5.WriteLock支持Condition,但是ReadLock不支持Condition,將拋出UnsupportedOperationException
          下面是個(gè)小例子:


          package com.google.study;

          import java.util.Map;
          import java.util.concurrent.ConcurrentHashMap;
          import java.util.concurrent.locks.ReentrantReadWriteLock;
          import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
          import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

          public class ReentrantLockStudy {
          private Map<Integer, Result> map = new ConcurrentHashMap<Integer, Result>();
          private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
          private final WriteLock writeLock = lock.writeLock();
          private final ReadLock readLock = lock.readLock();

          public Result get(Integer key) {
          Result value = null;
          readLock.lock();// 獲取讀鎖
          try {
          value = map.get(key);
          if (value == null) {// 如果沒(méi)有該結(jié)果
          readLock.unlock();// 必須釋放讀鎖
          writeLock.lock();// 獲取寫(xiě)鎖
          value = map.get(key);
          if (value == null) {
          value = getResult();
          map.put(key, value);
          }
          readLock.lock();// 重新降級(jí)為讀鎖
          writeLock.unlock();
          }
          } catch (Exception e) {
          writeLock.unlock();
          e.printStackTrace();
          } finally {
          readLock.unlock();
          }
          return value;
          }

          public void put(Integer key, Result value) {
          writeLock.lock();
          try {
          map.put(key, value);
          } finally {
          writeLock.unlock();
          }

          }

          private Result getResult() {
          return new Result();
          }

          private static class Result {

          }
          }

          posted on 2010-10-31 23:31 羔羊 閱讀(975) 評(píng)論(0)  編輯  收藏 所屬分類: concurrent

          主站蜘蛛池模板: 黑山县| 余姚市| 沐川县| 海淀区| 崇明县| 大洼县| 天水市| 景泰县| 桓仁| 延津县| 鄂托克前旗| 漳州市| 通海县| 甘孜| 枣庄市| 巫山县| 理塘县| 称多县| 咸丰县| 阿合奇县| 邵东县| 自贡市| 中宁县| 弥勒县| 揭阳市| 永州市| 赣州市| 满城县| 泊头市| 保山市| 罗源县| 尉氏县| 高淳县| 布拖县| 大石桥市| 荔浦县| 八宿县| 太谷县| 阜南县| 苍梧县| 拉萨市|