<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    ReadWriteLock

    Posted on 2011-10-17 16:59 瘋狂 閱讀(1121) 評論(0)  編輯  收藏 所屬分類: concurrent
         線程讀寫同一個對象的數據是很普遍的,通常,要避免讀寫沖突,必須保證任何時候僅有一個線程在寫入,有線程正在讀取的時候,寫入操作就必須等待。簡單說,就是要避免“寫-寫”沖突和“讀-寫”沖突。但是同時讀是允許的,因為“讀-讀”不沖突,而且很安全。
      沖jdk1.5開始可以使用ReadWriteLock類來防止讀寫沖突.它有一個已有的實現ReentrantReadWriteLock。
    ReentrantReadWriteLock使用內部維護的讀寫鎖來防止讀寫沖突;
     
      public ReentrantReadWriteLock.WriteLock writeLock() return writerLock; }
        
    public ReentrantReadWriteLock.ReadLock  readLock()  return readerLock; }
    示例代碼如下:

    public class RreadWriteLockTest {

      ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
      public int i  = 0;
    //讀取
     public void read() throws InterruptedException{
      readWriteLock.readLock().lock();//獲取讀鎖
      System.out.println("read thread:"+Thread.currentThread().getName());
      Thread.sleep(10000);
      System.out.println("read:"+i);
      readWriteLock.readLock().unlock();
     }
    //寫入
     public void write() throws InterruptedException{
      
      readWriteLock.writeLock().lock();//獲取寫鎖
      System.out.println("write thread:"+Thread.currentThread().getName());
      Thread.sleep(10000);
      i = 2;
      System.out.println("write:"+i);
    readWriteLock.writeLock().unlock();
     }
    }
    測試代碼:
    1 測試兩個同時讀的,結果都能同時讀取。
    2 測試一個讀,一個寫的,需要其中一個釋放鎖之后才能進行另外一個操作
    public static void main(String[] args) throws InterruptedException {
      final RreadWriteLockTest lockTest= new RreadWriteLockTest();
      new Thread(new Runnable() {
       
       @Override
       public void run() {
        try {
         lockTest.write();
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       }
      }).start();
      Thread.sleep(2000);
     new Thread(new Runnable() {
        @Override
        public void run() {
         try {
          lockTest.read();
         } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
       }).start();
     }
    打印如下:
    write thread:Thread-0執(zhí)行完之后(10秒之后)才執(zhí)行read thread:Thread-1

    注意:執(zhí)行完以后一定要執(zhí)行unlock,要不lock的計數沒有-1,這樣對應read或者write的操作將無法進行,一直等待。


    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲av高清在线观看一区二区| 国产成人亚洲综合a∨| 亚洲AV无码成H人在线观看| 免费视频爱爱太爽了| 91成人免费观看在线观看| 久久精品国产亚洲av天美18| 自怕偷自怕亚洲精品| 亚洲精品午夜无码专区| 亚洲Av无码国产情品久久 | 成人免费视频88| 91精品免费观看| 免费网站看av片| 不卡视频免费在线观看| 无码免费又爽又高潮喷水的视频| 亚洲日本VA中文字幕久久道具| 亚洲国产精品综合久久久| 国产精品高清视亚洲一区二区| 亚洲精品免费观看| 久久久久久久尹人综合网亚洲 | 国产精品久久亚洲一区二区| 国产精品亚洲一区二区麻豆| 亚洲国产片在线观看| 亚洲AV区无码字幕中文色| 久久久久久久综合日本亚洲| 亚洲综合在线另类色区奇米| 亚洲人成网站18禁止一区| 亚洲AV无码一区二区三区国产| 免费看国产精品麻豆| 国产成人免费福利网站| 国产青草视频免费观看97| 国产小视频免费观看| 国产免费观看网站| 亚洲AV无码乱码精品国产| 亚洲精品NV久久久久久久久久| 亚洲人成网站观看在线播放| 亚洲AⅤ视频一区二区三区| 免费大黄网站在线观看| 亚洲国产午夜福利在线播放| 亚洲男人第一无码aⅴ网站| 亚洲中文字幕无码一区二区三区| 人人狠狠综合久久亚洲婷婷|