【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统

来源:互联网 发布:天下3男捏脸大赛数据 编辑:程序博客网 时间:2024/06/05 02:23

先看一个程序

读与读不互斥、读与写互斥、写与写互斥


与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。

[java] view plain copy
 print?
  1. package xiaozhijingtian;  
  2.   
  3. import java.util.Random;  
  4.   
  5. public class ReadWriteLockTest {  
  6.   
  7.     public static void main(String[] args) {  
  8.         final ReadWriteObject object=new ReadWriteObject();  
  9.         for(int i=0;i<3;i++)  
  10.         {  
  11.             new Thread(){  
  12.                 public void run() {  
  13.                     while(true)  
  14.                         object.read();  
  15.                 };  
  16.             }.start();  
  17.               
  18.             new Thread(){  
  19.                 public void run() {  
  20.                     while(true)  
  21.                         object.write(new Random().nextInt(10));  
  22.                 };  
  23.             }.start();  
  24.         }  
  25.     }  
  26. }  
  27.   
  28. class ReadWriteObject{  
  29.     private int data;  
  30.     public void read()  
  31.     {  
  32.         System.out.println(Thread.currentThread().getName()+"我正准备读呢");  
  33.         try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}  
  34.         System.out.println(Thread.currentThread().getName()+"读出来了:"+data);  
  35.     }  
  36.       
  37.     public void write(int data)  
  38.     {  
  39.         System.out.println(Thread.currentThread().getName()+"我正准备写呢");  
  40.         try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}  
  41.         this.data=data;  
  42.         System.out.println(Thread.currentThread().getName()+"写完了:"+data);  
  43.     }  
  44. }  

运行结果:0、2、4还没读完,1线程就开始写了
[java] view plain copy
 print?
  1. Thread-0我正准备读呢  
  2. Thread-2我正准备读呢  
  3. Thread-4我正准备读呢  
  4. Thread-1我正准备写呢  
  5. Thread-5我正准备写呢  
  6. Thread-3我正准备写呢  
  7. Thread-1写完了:8  
  8. Thread-1我正准备写呢  
  9. Thread-3写完了:7  
  10. Thread-3我正准备写呢  
  11. Thread-4读出来了:7  

下面让读写锁展示一下自己的独门绝技


[java] view plain copy
 print?
  1. package xiaozhijingtian;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.locks.ReadWriteLock;  
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;  
  6.   
  7. public class ReadWriteLockTest {  
  8.   
  9.     public static void main(String[] args) {  
  10.         final ReadWriteObject object=new ReadWriteObject();  
  11.         for(int i=0;i<3;i++)  
  12.         {  
  13.             new Thread(){  
  14.                 public void run() {  
  15.                     while(true)  
  16.                         object.read();  
  17.                 };  
  18.             }.start();  
  19.               
  20.             new Thread(){  
  21.                 public void run() {  
  22.                     while(true)  
  23.                         object.write(new Random().nextInt(10));  
  24.                 };  
  25.             }.start();  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. class ReadWriteObject{  
  31.     private int data;  
  32.     private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();    
  33.     public void read()  
  34.     {  
  35.         readWriteLock.readLock().lock();  
  36.         System.out.println(Thread.currentThread().getName()+"我正准备读呢");  
  37.         try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}  
  38.         System.out.println(Thread.currentThread().getName()+"读出来了:"+data);  
  39.         readWriteLock.readLock().unlock();  
  40.     }  
  41.       
  42.     public void write(int data)  
  43.     {  
  44.         readWriteLock.writeLock().lock();  
  45.         System.out.println(Thread.currentThread().getName()+"我正准备写呢");  
  46.         try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}  
  47.         this.data=data;  
  48.         System.out.println(Thread.currentThread().getName()+"写完了:"+data);  
  49.         readWriteLock.writeLock().unlock();  
  50.     }  
  51. }  

运行结果

[java] view plain copy
 print?
  1. Thread-0我正准备读呢  
  2. Thread-2我正准备读呢  
  3. Thread-4我正准备读呢  
  4. Thread-0读出来了:0  
  5. Thread-4读出来了:0  
  6. Thread-2读出来了:0  
  7. Thread-1我正准备写呢  
  8. Thread-1写完了:8  
  9. Thread-1我正准备写呢  
  10. Thread-1写完了:9  
  11. Thread-1我正准备写呢  
  12. Thread-1写完了:9  
  13. Thread-1我正准备写呢  
  14. Thread-1写完了:9  
  15. Thread-1我正准备写呢  
  16. Thread-1写完了:2  
  17. Thread-3我正准备写呢  
  18. Thread-3写完了:4  
  19. Thread-3我正准备写呢  
  20. Thread-3写完了:4  
  21. Thread-3我正准备写呢  
  22. Thread-3写完了:0  
  23. Thread-3我正准备写呢  
  24. Thread-3写完了:9  
  25. Thread-5我正准备写呢  
  26. Thread-5写完了:8  
  27. Thread-5我正准备写呢  
  28. Thread-5写完了:1  
  29. Thread-0我正准备读呢  
  30. Thread-4我正准备读呢  
  31. Thread-2我正准备读呢  
  32. Thread-4读出来了:1  
  33. Thread-2读出来了:1  
  34. Thread-0读出来了:1  
  35. Thread-1我正准备写呢  
  36. Thread-1写完了:3  
  37. Thread-1我正准备写呢  
  38. Thread-1写完了:1  
  39. Thread-1我正准备写呢  
  40. Thread-1写完了:2  
  41. Thread-3我正准备写呢  
  42. Thread-3写完了:0  
  43. Thread-5我正准备写呢  
  44. Thread-5写完了:3  
  45. Thread-5我正准备写呢  
  46. Thread-5写完了:9  
  47. Thread-5我正准备写呢  
  48. Thread-5写完了:2  
  49. Thread-5我正准备写呢  
  50. Thread-5写完了:2  
  51. Thread-4我正准备读呢  
  52. Thread-2我正准备读呢  
  53. Thread-0我正准备读呢  
  54. Thread-2读出来了:2  
  55. Thread-4读出来了:2  
  56. Thread-0读出来了:2  
  57. Thread-1我正准备写呢  

自己写一个缓存系统


[java] view plain copy
 print?
  1. package com.xiaozhi.threadlocal2;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5. import java.util.concurrent.locks.ReadWriteLock;  
  6. import java.util.concurrent.locks.ReentrantReadWriteLock;  
  7.   
  8. public class Test3 {  
  9.   
  10.     public static void main(String[] args) {  
  11.           
  12.     }  
  13. }  
  14.   
  15. class Cache{  
  16.     private Map<String,Object>map=new HashMap<String, Object>();  
  17.     private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();  
  18.     public Object get(String key){  
  19.         readWriteLock.readLock().lock();  
  20.         Object value = null;  
  21.         try {  
  22.             value = map.get(key);  
  23.             if(value==null)  
  24.             {  
  25.                 readWriteLock.readLock().unlock();  
  26.                 readWriteLock.writeLock().lock();  
  27.                 try {  
  28.                     if(value==null)  
  29.                     value="jingtianxiaozhi";//QueryDB(key)  
  30.                 } finally{  
  31.                     readWriteLock.writeLock().unlock();  
  32.                 }  
  33.                 readWriteLock.readLock().lock();  
  34.             }  
  35.         } finally{  
  36.             readWriteLock.readLock().unlock();  
  37.         }  
  38.         return value;  
  39.     }  
  40. }  
0 0