1 package com.atguigu.boot.com.atguigu; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.concurrent.TimeUnit; 6 import java.util.concurrent.locks.Lock; 7 import java.util.concurrent.locks.ReentrantReadWriteLock; 8 9 class MyCache { 10 private volatile Map<String,Object> map=new HashMap<>(); 11 private ReentrantReadWriteLock rwLock=new ReentrantReadWriteLock(); 12 13 public void set(String key,Object value){ 14 15 rwLock.writeLock().lock(); 16 System.out.println(Thread.currentThread().getName()+"\t 正在写入"+key); 17 try {TimeUnit.MICROSECONDS.sleep(300);} catch (InterruptedException e) {e.printStackTrace();} 18 map.put(key,value); 19 System.out.println(Thread.currentThread().getName()+"\t 写入完成"); 20 rwLock.writeLock().unlock(); 21 } 22 public void get(String key){ 23 rwLock.readLock().lock(); 24 System.out.println(Thread.currentThread().getName()+"\t 正在读取"+key); 25 try {TimeUnit.MICROSECONDS.sleep(300);} catch (InterruptedException e) {e.printStackTrace();} 26 Object result = map.get(key); 27 System.out.println(Thread.currentThread().getName()+"\t 读取完成"+result); 28 rwLock.readLock().unlock(); 29 } 30 } 31 32 public class ReadWriteLockDemo { 33 public static void main(String[] args) { 34 MyCache myCache=new MyCache(); 35 for (int i = 0; i <5 ; i++) { 36 final int tempInt = i; 37 new Thread(()->{ 38 myCache.set(tempInt+"",tempInt+""); 39 },String.valueOf(i)).start(); 40 } 41 for (int i = 0; i <5 ; i++) { 42 final int tempInt = i; 43 new Thread(()->{ 44 myCache.get(tempInt+""); 45 },String.valueOf(i)).start(); 46 } 47 } 48 }
1 正在写入1 1 写入完成 0 正在写入0 0 写入完成 2 正在写入2 2 写入完成 3 正在写入3 3 写入完成 4 正在写入4 4 写入完成 0 正在读取0 1 正在读取1 2 正在读取2 4 正在读取4 3 正在读取3 0 读取完成0 3 读取完成3 1 读取完成1 4 读取完成4 2 读取完成2 Process finished with exit code 0
//结果显示写操作的时候必须保证原子性+独占,整个过程必须是一个完整的统一体,中间不能被分割,被打断
//为了保证并发量,读取资源共享应该同时进行,所以对于ReentrantLock和synchronized不满足
//读-读能共存
//读-写不能共存
//写-写不能共存
原文:https://www.cnblogs.com/ffzzcommsoft/p/14729589.html