Java教程

Java并发多线程编程——ReentrantReadWriteLock中的锁降级详解

本文主要是介绍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中的锁降级详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!