ReentrantReadWriteLock

  1. package com.yonge.lock;  

  2.   

  3. import java.util.Random;  

  4. import java.util.concurrent.locks.ReentrantReadWriteLock;  

  5.   

  6. /** 

  7.  * 需求:多線程操作同一數據,可以多線程同時讀數據,只能一個線程修改數據; 

  8.  * @author wb-gaoy 

  9.  * @version $Id: ShareData.java,v 0.1 2011-12-31 下午3:00:09 wb-gaoy Exp $ 

  10.  */  

  11. public class ShareData {  

  12.   

  13.     private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();  

  14.   

  15.     private String                 data;  

  16.   

  17.     public ShareData(String data) {  

  18.         this.data = data;  

  19.     }  

  20.   

  21.     /** 

  22.      * 修改數據的方法 

  23.      * @param str 

  24.      */  

  25.     public void merge(String str) {  

  26.         lock.writeLock().lock();  

  27.         System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  28.                            + Thread.currentThread().getId() + "    locking...");  

  29.         try {  

  30.             data = str;  

  31.             System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  32.                                + Thread.currentThread().getId() + "   修改爲:" + str);  

  33.             Thread.sleep(50);  

  34.         } catch (InterruptedException e) {  

  35.             e.printStackTrace();  

  36.         } finally {  

  37.             System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  38.                                + Thread.currentThread().getId() + "    unlock...");  

  39.             lock.writeLock().unlock();  

  40.         }  

  41.     }  

  42.   

  43.     /** 

  44.      * 獲取數據的方法 

  45.      */  

  46.     public String get() {  

  47.         lock.readLock().lock();  

  48.         System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  49.                            + Thread.currentThread().getId() + "    locking...");  

  50.         try {  

  51.             System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  52.                                + Thread.currentThread().getId() + "   獲取爲:" + data);  

  53.             Thread.sleep(50);  

  54.         } catch (InterruptedException e) {  

  55.             e.printStackTrace();  

  56.         } finally {  

  57.             lock.readLock().unlock();  

  58.             System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"  

  59.                                + Thread.currentThread().getId() + "    unlock...");  

  60.         }  

  61.         return data;  

  62.     }  

  63.   

  64.     /** 

  65.      * @param args 

  66.      */  

  67.     public static void main(String[] args) {  

  68.   

  69.         final ShareData shareData = new ShareData("Hello,World!!");  

  70.   

  71.         for (int i = 0; i < 50; i++) {  

  72.             new Thread(new Runnable() {  

  73.   

  74.                 @Override  

  75.                 public void run() {  

  76.                     shareData.get();  

  77.                 }  

  78.             }, "A").start();  

  79.   

  80.             new Thread(new Runnable() {  

  81.   

  82.                 @Override  

  83.                 public void run() {  

  84.                     shareData.merge(new Random().nextLong() + "");  

  85.                 }  

  86.             }, "B").start();  

  87.   

  88.         }  

  89.     }  

  90.   

  91.     /** 

  92.      * 總結: 

  93.      *      1、readLock在沒有被釋放的時候可以被多個線程同時讀取,此時還可以重入writeLock鎖 

  94.      *      2、writeLock在沒有被釋放的時候其他鎖不能進入,也不能重入readLock鎖,直到writeLock被解鎖 

  95.      */  

  96. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章