其他分享
首页 > 其他分享> > 独占锁(写锁)/共享锁(读锁)/互斥锁

独占锁(写锁)/共享锁(读锁)/互斥锁

作者:互联网

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

 

标签:读取,写锁,写入,util,互斥,读锁,key,import,String
来源: https://www.cnblogs.com/ffzzcommsoft/p/14729589.html