8.读写锁ReadWriteLock

/*ReadWriteLock 读写锁*/

private ReadWriteLock lock = new ReentrantReadWriteLock();

lock.readLock().lock();    lock.writeLock().lock();

ReadWriteLock 维护了 /*一对*/ 相关的锁,一个用于只读操作,另一个用于写入操作

只要没有writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的


ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须是独占的方式来获取锁。对于读取操作占多数的数据结构。

ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作

 

 1 /*
 2  * 1.ReadWriterLock : 读写锁
 3  * 
 4  * 写写 /读写 需要 “互斥”
 5  * 读读 不需要互斥
 6  * */
 7 
 8 public class TestReadWriteLock {
 9     
10     public static void main(String[] args) {
11         //匿名内部类 使用外部的参数 需要加上 final (1.8之后就不需要了 ,但是也不能修改)
12         //这和外部参数的生命周期有关
13          final ReadWriteLockThread lt = new ReadWriteLockThread();
14         
15         //创建一个 ‘写’ 线程
16         new Thread(new Runnable() {
17             @Override
18             public void run() {
19                 lt.write(10);
20             }
21         },"write").start();
22         
23         ////创建100个 ‘读’ 线程
24         for(int i = 0;i<100;i++) {
25             
26             new Thread(new Runnable() {
27                 @Override
28                 public void run() {
29                     lt.read();
30                 }
31             },"read").start();
32         }
33     }
34 }
35 class ReadWriteLockThread {
36     private int number = 1;
37     private ReadWriteLock lock = new ReentrantReadWriteLock();
38 
39     public void read() {
40         lock.readLock().lock();
41         try {
42             System.out.println(number);
43         } finally {
44             lock.readLock().unlock();
45         }
46         
47     }
48     
49     public void write(int number) {
50         lock.writeLock().lock();
51         try {
52             System.out.println(this.number);
53             this.number = number;
54         } finally {
55             lock.writeLock().unlock();
56         }
57     }
58 }

 

posted @ 2017-08-25 17:52  白日梦想家12138  阅读(176)  评论(0编辑  收藏  举报