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 }