春風博客

          春天里,百花香...

          導航

          <2007年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          統(tǒng)計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          讀寫鎖的OO分析

          我們有時會遇到對同一個內(nèi)存區(qū)域如數(shù)組或者鏈表進行多線程讀寫的情況,一般來說有以下幾種處理方式:
          1.不加任何限制,多見于讀取寫入都很快的情況,但有時也會出現(xiàn)問題.
          2.對讀寫函數(shù)都加以同步鎖,比如使用singleton模式,這下問題是沒了,但效率也下去了,比如說兩個讀取線程不是非要排隊進入不可.
          3.讀寫鎖,安全和效率都得到了解決,特別合適讀線程多于寫線程的情況.也就是下面將要展現(xiàn)的模式.

          讀寫鎖的本意是分別對讀寫狀態(tài)進行互斥區(qū)分,有互斥時才加鎖,否則放行.互斥的情況有:
          1.讀寫互斥.
          2.寫寫互斥.
          不互斥的情況是:讀讀,這種情況不該加以限制.

          我們只要讓鎖對象知道當前讀寫狀態(tài)就可以了,再根據(jù)情況進行鎖定和解鎖,然后再分情況進行鎖定.請看代碼

          代碼如下:
          DataLib類,注意其中try...finally 的寫法,它保證了加鎖解鎖過程是成對調(diào)用的:
          package com.sitinspring.readwritelock;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 數(shù)據(jù)倉庫類,用于保存數(shù)據(jù)
           * 
           * 
          @author sitinspring(junglesong@gmail.com)
           * 
           
          */

          public class DataLib {
              
          private List<String> datas;

              
          private ReadWriteLock lock;

              
          public DataLib() {
                  datas 
          = new ArrayList<String>();
                  lock 
          = new ReadWriteLock();
              }


              
          // 寫入數(shù)據(jù),這時不能讀取
              public void writeData(List<String> newDatas) {
                  
          try {
                      lock.writeLock();
                      Test.sleep(
          2);
                      datas
          =newDatas;
                  }
           finally {
                      lock.writeUnlock();
                  }

              }


              
          // 讀取數(shù)據(jù),這時不能寫入
              public List<String> readData() {
                  
          try {
                      lock.readLock();
                      Test.sleep(
          1);            
                      
          return datas;
                  }
           finally {
                      lock.readUnlock();
                  }


              }


          }

          ReadWriteLock類,很重要:
          package com.sitinspring.readwritelock;

          /**
           * 讀寫鎖,用于線程控制
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class ReadWriteLock{
              
          // 讀狀態(tài)
              private boolean isRead;
              
              
          // 寫狀態(tài)
              private boolean isWrite;
              
              
          public synchronized void readLock(){
                  
          // 有寫入時讀取線程停止
                  while(isWrite){
                      
          try{    
                          System.out.println(
          "有線程在進行寫入,讀取線程停止,進入等待狀態(tài)");
                          wait();
                      }

                      
          catch(InterruptedException ex){
                          ex.printStackTrace();
                      }

                  }

                  
                  System.out.println(
          "設(shè)定鎖為讀取狀態(tài)");
                  isRead
          =true;
              }

              
              
          public synchronized void readUnlock(){
                  System.out.println(
          "解除讀取鎖");
                  isRead
          =false;
                  notifyAll();
              }

              
              
          public synchronized void writeLock(){
                  
          // 有讀取時讀取線程停止
                  while(isRead){
                      
          try{    
                          System.out.println(
          "有線程在進行讀取,寫入線程停止,進入等待狀態(tài)");
                          wait();
                      }

                      
          catch(InterruptedException ex){
                          ex.printStackTrace();
                      }

                  }

                  
                  
          // 有寫入時寫入線程也一樣要停止
                  while(isWrite){
                      
          try{    
                          System.out.println(
          "有線程在進行寫入,寫入線程停止,進入等待狀態(tài)");
                          wait();
                      }

                      
          catch(InterruptedException ex){
                          ex.printStackTrace();
                      }

                  }

                  
                  System.out.println(
          "設(shè)定鎖為寫入狀態(tài)");
                  isWrite
          =true;
              }

              
              
          public synchronized void writeUnlock(){
                  System.out.println(
          "解除寫入鎖");
                  isWrite
          =false;
                  notifyAll();
              }

          }


          Writer類:
          package com.sitinspring.readwritelock;

          import java.util.ArrayList;
          import java.util.Random;

          /**
           * 用于讀取文件,寫入數(shù)據(jù)倉庫
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class Writer implements Runnable{
              
          private DataLib dataLib;
              
          private static final Random random=new Random();
              
          private String[] mockDatas={"","","","","","","","","",""};    
              
              
          public Writer(DataLib dataLib,String[] mockDatas){
                  
          this.dataLib=dataLib;
                  
          this.mockDatas=mockDatas;
                  
                  Thread thread
          =new Thread(this);
                  thread.start();
              }

              
              
          public void run(){
                  
          while(true){
                      Test.sleep(random.nextInt(
          3));
                      
                      
          int startIndex=random.nextInt(mockDatas.length);
                      
                      ArrayList
          <String> newDatas=new ArrayList<String>();
                      
          for(int i=startIndex;i<mockDatas.length;i++){
                          newDatas.add(mockDatas[i]);
                      }

                      
                      dataLib.writeData(newDatas);
                  }

              }

          }


          Reader類:
          package com.sitinspring.readwritelock;

          import java.util.List;
          import java.util.Random;

          /**
           * 用于從數(shù)據(jù)倉庫中得到數(shù)據(jù)
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class Reader implements Runnable{
              
          private DataLib dataLib;
              
          private static final Random random=new Random();
              
              
          public Reader(DataLib dataLib){
                  
          this.dataLib=dataLib;
              
                  Thread thread
          =new Thread(this);
                  thread.start();
              }

              
              
          public void run(){
                  
          while(true){
                      Test.sleep(random.nextInt(
          2));            
                      List
          <String> datas=dataLib.readData();
                      
                      System.out.print(
          ">>取得數(shù)組為:");
                      
          for(String data:datas){
                          System.out.print(data
          +",");
                      }

                      System.out.print(
          "\n");
                  }

              }

          }


          測試類:
          package com.sitinspring.readwritelock;

          /**
           * main函數(shù)所在類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class Test{
              
          public static void main(String[] args){
                  DataLib dataLib
          =new DataLib();
                  
                  String[] mockDatas1
          ={"","","","","","","","","",""};
                  Writer writer1
          =new Writer(dataLib,mockDatas1);
                  
                  String[] mockDatas2
          ={"","","","","","","","","","","",""};
                  Writer writer2
          =new Writer(dataLib,mockDatas2);
                  
                  Reader reader1
          =new Reader(dataLib);
                  Reader reader2
          =new Reader(dataLib);
                  Reader reader3
          =new Reader(dataLib);
              }

              
              
              
          // 用于延時
              public static void sleep(int sleepSecond){
                  
          try{
                      Thread.sleep(sleepSecond
          *1000);
                  }

                  
          catch(Exception ex){
                      ex.printStackTrace();
                  }

              }

          }


          測試結(jié)果:
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:
          設(shè)定鎖為讀取狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          設(shè)定鎖為寫入狀態(tài)
          >>取得數(shù)組為:
          解除讀取鎖
          >>取得數(shù)組為:
          解除讀取鎖
          >>取得數(shù)組為:
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:亥,
          解除讀取鎖
          >>取得數(shù)組為:亥,
          解除讀取鎖
          >>取得數(shù)組為:亥,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:申,酉,戌,亥,
          解除讀取鎖
          >>取得數(shù)組為:申,酉,戌,亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:巳,午,未,申,酉,戌,亥,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:巳,午,未,申,酉,戌,亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:戌,亥,
          解除讀取鎖
          >>取得數(shù)組為:戌,亥,
          解除讀取鎖
          >>取得數(shù)組為:戌,亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:丙,丁,戊,己,庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:丙,丁,戊,己,庚,設(shè)定鎖為寫入狀態(tài)
          辛,壬,癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丙,丁,戊,己,庚,辛,壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          解除讀取鎖
          >>取得數(shù)組為:癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:戊,己,庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:戊,己,庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:戊,己,庚,辛,壬,癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:乙,解除讀取鎖
          >>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
          丙,丁,戊,己,庚,辛,有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:庚,辛,壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:亥,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:亥,
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          解除讀取鎖
          >>取得數(shù)組為:癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:癸,
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:申,酉,戌,亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:戊,己,庚,辛,壬,癸,
          解除讀取鎖
          >>取得數(shù)組為:戊,己,庚,辛,壬,癸,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:亥,
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:亥,
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
          解除讀取鎖
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
          解除寫入鎖
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          解除讀取鎖
          >>取得數(shù)組為:癸,
          解除讀取鎖
          >>取得數(shù)組為:癸,
          解除讀取鎖
          >>取得數(shù)組為:癸,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行讀取,寫入線程停止,進入等待狀態(tài)
          解除讀取鎖
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          >>取得數(shù)組為:辰,巳,午,未,申,酉,戌,亥,
          有線程在進行寫入,寫入線程停止,進入等待狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)
          解除寫入鎖
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為讀取狀態(tài)
          設(shè)定鎖為寫入狀態(tài)
          有線程在進行寫入,讀取線程停止,進入等待狀態(tài)

          代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/ReadWriteLock20071021115927.rar

          posted on 2007-10-21 11:42 sitinspring 閱讀(3282) 評論(2)  編輯  收藏 所屬分類: Object Orient Programming

          評論

          # re: 讀寫鎖的OO分析[未登錄] 2007-11-13 13:38 曲強 Nicky

          http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/ReentrantWriterPreferenceReadWriteLock.html
          這個挺有意思的。

          AOP我在學,感覺思想不錯  回復  更多評論   

          # re: 讀寫鎖的OO分析 2007-11-14 19:12 sitinspring

          @曲強 Nicky

          兩者差不多嘛,讀寫鎖對于Cache是很有用的.
            回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 德安县| 阜阳市| 百色市| 扎赉特旗| 巴彦淖尔市| 关岭| 汶上县| 永德县| 大余县| 闽清县| 墨玉县| 仁寿县| 五峰| 泰顺县| 张家口市| 赤峰市| 吴忠市| 泊头市| 山东省| 贺州市| 板桥市| 武强县| 金昌市| 宜昌市| 隆昌县| 阿坝县| 文安县| 萨迦县| 昭苏县| 图木舒克市| 游戏| 阿尔山市| 鹿泉市| 犍为县| 昌黎县| 巴马| 漠河县| 宁化县| 修武县| 土默特右旗| 汨罗市|