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不满足
//读-读能共存
//读-写不能共存
//写-写不能共存