JUC---04Lock(二)ReentrantReadWriteLock

1.读写锁

  分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!

  WriteLock可以获取ReadLock,但是ReadLock不能获取WriteLock

  锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性

2.核心方法

  

 3.代码实现

 1 package com.jenne.mydemo;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map; 6 import java.util.concurrent.TimeUnit;
 7 import java.util.concurrent.locks.ReadWriteLock;
 8 import java.util.concurrent.locks.ReentrantReadWriteLock;
 9 
10 
11 class MyCache {
12     private volatile Map<String, String> map = new HashMap<>();
13     private ReadWriteLock rwLock = new ReentrantReadWriteLock();
14 
15 
16     public void put(String key, String value) {
17         rwLock.writeLock().lock();//获取写锁
18         try {
19 
20             System.out.println(Thread.currentThread().getName() + "--->准备写入数据--->" + key);
21             TimeUnit.MILLISECONDS.sleep(200);
22             map.put(key, value);
23             System.out.println(Thread.currentThread().getName() + "--->写入数据完成--->" + key);
24 
25         } catch (Exception e) {
26             e.printStackTrace();
27         } finally {
28             rwLock.writeLock().unlock();//解除写锁
29         }
30     }
31 
32     public void get(String key) {
33         rwLock.readLock().lock();//获取读锁
34         try {
35 
36             System.out.println(Thread.currentThread().getName() + "--->准备读取数据--->" + key);
37             TimeUnit.MILLISECONDS.sleep(200);
38             String value = map.get(key);
39             System.out.println(Thread.currentThread().getName() + "--->读取数据完成--->" + value);
40 
41         } catch (Exception e) {
42             e.printStackTrace();
43         } finally {
44             rwLock.readLock().unlock();//获取读锁
45         }
46     }
47 }
48 
49 public class ReadWriteLockDemo {
50 
51     public static void main(String[] args) throws InterruptedException {
52 
53         MyCache myCache = new MyCache();
54 
55         for (int i = 1; i <= 5; i++) {
56             String key = String.valueOf(i);
57 
58             new Thread(() -> {
59                 myCache.put(key, key);
60             }).start();
61         }
62 
63         TimeUnit.SECONDS.sleep(2);
64 
65         for (int i = 1; i <= 5; i++) {
66             String key = String.valueOf(i);
67             new Thread(() -> {
68                 myCache.get(key);
69             }).start();
70         }
71 
73     }
74 }

 

posted @ 2020-05-06 03:46  Jenne  阅读(177)  评论(0)    收藏  举报