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 閱讀(1519) 評論(0)  編輯  收藏 所屬分類: Java App

          主站蜘蛛池模板: 阜宁县| 永城市| 东莞市| 贞丰县| 黑水县| 化州市| 突泉县| 庆安县| 哈尔滨市| 铁岭市| 衡东县| 丹阳市| 康保县| 遂宁市| 利川市| 成安县| 五指山市| 黄浦区| 微博| 栖霞市| 江达县| 定远县| 临洮县| 浮山县| 平江县| 凤山县| 改则县| 蓝田县| 库尔勒市| 长白| 哈密市| 昭通市| 贵南县| 开江县| 银川市| 化州市| 齐河县| 昔阳县| 互助| 蒲江县| 邳州市|