Loading

读写锁

 1 /**
 2  /** * 独占锁(写锁)
 3  一次只能被一个线程占有
 4  * 共享锁(读锁) 多个线程可以同时占有
 5  * * ReadWriteLock
 6  * 读-读  可以共存!
 7  * 读-写  不能共存!
 8  * 写-写  不能共存!
 9  * readWriteLock
10  */
11 public class ReadWriteLockDmoe {
12     public static void main(String[] args) {
13         MyCacheLock c = new MyCacheLock();
14         //写入
15         for (int i = 1; i <= 5; i++) {
16             int temp = i;
17             new Thread(() -> {
18                 c.put(temp + "", temp + "");
19             }, String.valueOf(i)).start();
20         }
21 
22         //读取
23         for (int i = 1; i <= 5; i++) {
24             int temp = i;
25             new Thread(() -> {
26                 c.get(temp + "");
27             }, String.valueOf(i)).start();
28         }
29     }
30 
31 }
32 
33 /**
34  * 加锁
35  */
36 class MyCacheLock {
37     private volatile Map<String, Object> map = new HashMap<>();
38     ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
39 
40 
41     //存写 ,写入的时候只希望同时只有一个线程写
42     public void put(String key, Object value) {
43         readWriteLock.writeLock().lock();
44         try {
45             System.out.println(Thread.currentThread().getName()+"写入"+key);
46             map.put(key, value);
47             System.out.println(Thread.currentThread().getName()+"写入OK!");
48         }catch (Exception e){
49             e.printStackTrace();
50         }finally {
51            readWriteLock.writeLock().unlock();
52         }
53 
54     }
55 
56     //取读  所有人可以读
57     public void get(String key) {
58         readWriteLock.readLock().lock();
59         try {
60             System.out.println(Thread.currentThread().getName() + "读取" + key);
61             Object o = map.get(key);
62             System.out.println(Thread.currentThread().getName() + "读取OK");
63         } catch (Exception e) {
64             e.printStackTrace();
65         } finally {
66             readWriteLock.readLock().unlock();
67         }
68     }
69 }
70 
71 
72 /**
73  *
74  */
75 class MyCache {
76     private volatile Map<String, Object> map = new HashMap<>();
77 
78     //存写
79     public void put(String key, Object value) {
80         System.out.println(Thread.currentThread().getName() + "写入" + key);
81         map.put(key, value);
82         System.out.println(Thread.currentThread().getName() + "写入OK!");
83     }
84 
85     //取读
86     public void get(String key) {
87         System.out.println(Thread.currentThread().getName() + "读取" + key);
88         Object o = map.get(key);
89         System.out.println(Thread.currentThread().getName() + "读取OK");
90     }
91 }

 

posted @ 2020-04-14 11:58  Rzk  阅读(109)  评论(0编辑  收藏  举报