vjame

          優化代碼是無止境的
          隨筆 - 65, 文章 - 9, 評論 - 26, 引用 - 0
          數據加載中……

          高性能鎖ReentrantReadWriteLock

          多線程讀取并修改一個資源時,通常使用synchronized同步鎖。性能損失情況很嚴重。jdk5.0以后提供了新的ReentrantReadWriteLock可以提供比synchronized更高性能的并發。

          Dictionary.java
          package com.test;

          import java.util.HashMap;
          import java.util.concurrent.locks.Lock;
          import java.util.concurrent.locks.ReentrantReadWriteLock;

          public class Dictionary {

              
          private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

              
          private final Lock read = readWriteLock.readLock();

              
          private final Lock write = readWriteLock.writeLock();

              
          private HashMap<String, String> dictionary = new HashMap<String, String>();

              
          public void set(String key, String value) {
                  write.lock();
                  
          try {
                      dictionary.put(key, value);
                  } 
          finally {
                      write.unlock();
                  }
              }

              
          public String get(String key) {
                  read.lock();
                  
          try {
                      
          return dictionary.get(key);
                  } 
          finally {
                      read.unlock();
                  }
              }

              
          public String[] getKeys() {
                  read.lock();
                  
          try {
                      String keys[] 
          = new String[dictionary.size()];
                      
          return dictionary.keySet().toArray(keys);
                  } 
          finally {
                      read.unlock();
                  }
              }

              
          public static void main(String[] args) {
                  Dictionary dictionary 
          = new Dictionary();
                  dictionary.set(
          "java""object oriented");
                  dictionary.set(
          "linux""rulez");
                  
          //dictionary.set("C++", "lanjh");
                  Writer writer = new Writer(dictionary, "Mr. Writer ");
                  
          //Writer writer2 = new Writer(dictionary, "Mr. Writer 2");
                  Reader reader1 = new Reader(dictionary, "Mrs Reader 1");
                  Reader reader2 
          = new Reader(dictionary, "Mrs Reader 2");
                  Reader reader3 
          = new Reader(dictionary, "Mrs Reader 3");
                  Reader reader4 
          = new Reader(dictionary, "Mrs Reader 4");
                  Reader reader5 
          = new Reader(dictionary, "Mrs Reader 5");
                  writer.start();
                  
          //writer2.start();
                  reader1.start();
                  reader2.start();
                  reader3.start();
                  reader4.start();
                  reader5.start();
              }
          }

          Reader.java
          package com.test;

          public class Reader extends Thread{
                 
                 
          private Dictionary dictionary = null;
                 
          public Reader(Dictionary d, String threadName) {
                   
          this.dictionary = d;
                   
          this.setName(threadName);
                 }
                 
                 
          private boolean runForestRun = true;

                 
          public void run() {
                   
          while (runForestRun) {
                     String [] keys 
          = dictionary.getKeys();
                     
          for (String key : keys) {
                       
          //reading from dictionary with READ LOCK
                       String value = dictionary.get(key);
                       
                       
          //make what ever you want with the value.
                       System.out.println(this.getName()+" = "+key + " : " + value);
                     }
                     
                     
          //update every seconds
                     try {
                       Thread.sleep(
          1000);
                     } 
          catch (InterruptedException e) {
                       e.printStackTrace();
                     }
                   }
                 }
                 
                 
          public void stopReader(){
                   
          this.runForestRun = false;
                   
          this.interrupt();
                 }
               }



          Writer.java
          package com.test;

          public class Writer extends Thread{
                 
          private boolean runForestRun = true;
                 
          private Dictionary dictionary = null;
                 
                 
          public Writer(Dictionary d, String threadName) {
                   
          this.dictionary = d;
                   
          this.setName(threadName);
                 }
                 @Override
                 
          public void run() {
                   
          while (this.runForestRun) { 
                     String [] keys 
          = dictionary.getKeys();
                     
          for (String key : keys) {
                       String newValue 
          = getNewValueFromDatastore(key);
                       
          //updating dictionary with WRITE LOCK
                       dictionary.set(key, newValue);
                       System.out.println(
          this.getName()+" = "+key + " : " + newValue);

                     }
                     
                     
          //update every seconds
                     try {
                       Thread.sleep(
          1000);
                     } 
          catch (InterruptedException e) {
                       e.printStackTrace();
                     }
                   }
                 }
                 
          public void stopWriter(){
                   
          this.runForestRun = false;
                   
          this.interrupt();
                 }
                 
          public String getNewValueFromDatastore(String key){
                   
          //This part is not implemented. Out of scope of this artile
                   return key;
                 }
               }



          posted on 2008-12-22 14:57 lanjh 閱讀(1524) 評論(0)  編輯  收藏 所屬分類: Java App

          主站蜘蛛池模板: 旬邑县| 肃南| 易门县| 北流市| 济宁市| 邵阳市| 儋州市| 巴中市| 萝北县| 彭州市| 工布江达县| 双柏县| 卓尼县| 青浦区| 雅江县| 永胜县| 长治市| 县级市| 五峰| 前郭尔| 白沙| 邢台市| 肥乡县| 西乡县| 密云县| 乌兰浩特市| 会东县| 平阳县| 双江| 昌乐县| 囊谦县| 张家港市| 临泽县| 柳河县| 大渡口区| 丁青县| 绍兴县| 涡阳县| 诸暨市| 永吉县| 盐边县|