读写锁
ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的

Demo:- package org.example.rw;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class ReadWriteLockDemo {
- /*
- * 读读 - 可以共存 (共享锁)
- * 读写 - 不能共存 (独占锁)
- * 写写 - 不能共存 (独占锁)
- * */
- public static void main(String[] args) {
- MyCache myCache = new MyCache();
- // 写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占
- for (int i = 1; i <= 5; i++) {
- final int temp = i;
- new Thread(()->{
- myCache.put(""+temp,temp);
- },String.valueOf(i)).start();
- }
- // 读取:可以插队抢占资源以实现资源的最大化利用
- for (int i = 1; i <= 5; i++) {
- final int temp = i;
- new Thread(()->{
- myCache.get(temp+"");
- },String.valueOf(i)).start();
- }
- }
- }
- class MyCache{
- private volatile Map<String,Object> cache = new HashMap<>();
- ReadWriteLock rwLock = new ReentrantReadWriteLock();
- // 细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位
- public void put(String key,Object value){
- rwLock.writeLock().lock();
- try {
- System.out.println(Thread.currentThread().getName()+":"+key+"开始写入");
- cache.put(key,value);
- System.out.println(Thread.currentThread().getName()+":"+key+"写入完成");
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- rwLock.writeLock().unlock();
- }
- }
- // 细粒化控制:读 - 所有人都可以读
- public Object get(String key){
- rwLock.readLock().lock();
- Object o = null;
- try {
- System.out.println(Thread.currentThread().getName()+":"+key+"开始读取");
- o = cache.get(key);
- System.out.println(Thread.currentThread().getName()+":"+key+"读取完成");
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- rwLock.readLock().unlock();
- }
- return o;
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |