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

          主站蜘蛛池模板: 阿拉善右旗| 黄大仙区| 华宁县| 齐齐哈尔市| 临汾市| 平舆县| 广水市| 广德县| 田阳县| 屏山县| 宜昌市| 海伦市| 西安市| 桐城市| 克东县| 麦盖提县| 阳新县| 武夷山市| 尖扎县| 桃江县| 富平县| 新昌县| 湖南省| 昆山市| 常宁市| 孟村| 灵石县| 延津县| 衡南县| 莒南县| 和政县| 渭源县| 体育| 永济市| 札达县| 南部县| 金门县| 张北县| 香河县| 马关县| 昌邑市|