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 }

浙公网安备 33010602011771号