本文主要是介绍Java并发多线程编程——ReentrantReadWriteLock中的锁降级详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、ReentrantReadWriteLock中的降级锁
- 降级锁是指写锁降级为读锁。
- 在写锁没有释放的时候,获取到读锁,再释放写锁。
二、ReentrantReadWriteLock降级锁的代码示例
package com.xz.thread.t12;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @description: ReentrantReadWriteLock降级锁示例
* @author: xz
* @create: 2021-05-17 22:09
*/
public class Demo {
/**
* 1、ReentrantReadWriteLock实例实现了ReadWriteLock接口
* 2、声明一个ReentrantReadWriteLock实例,指向父类ReadWriteLock的引用
* 因为ReentrantReadWriteLock可以保证公平或者非公平
* 3、ReadWriteLock类中只有readLock()和writeLock() 两个方法
*/
private ReadWriteLock rwl =new ReentrantReadWriteLock();
//读锁
private Lock r =rwl.readLock();
//写锁
private Lock w =rwl.writeLock();
//声明一个map,存储数据
private Map<String,Object> map =new HashMap<>();
//声明一个boolean类型的状态,用于判断是读操作还是写操作;volatile关键字保证可见性
private volatile boolean isUpdateStatus;
//定义一个读写方法
public void readWriteMethod(){
r.lock();//为了保证isUpdateStatus能够获取到最新的值,添加读锁
if(isUpdateStatus){//如果isUpdateStatus是最新的值
r.unlock();//因为要进行写操作,所以需要释放读锁
w.lock();//在写操作之前,为了保证写的状态,需要加写锁
map.put("key1","v1");//写操作
//开始锁降级;
//再写操作没有释放的时候,获取到读锁,再释放写锁
r.lock();
w.unlock();//写操作完成后释放写锁
//锁降级完成;
}
Object obj = map.get("key1");//写操作
r.unlock();//释放读锁
System.out.println(Thread.currentThread().getName()+"读操作获取到的值:"+obj);
}
}
这篇关于Java并发多线程编程——ReentrantReadWriteLock中的锁降级详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!