首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将ReaderWriterLockSlim UpgradeableReadLock降级为简单的ReadLock

在云计算领域,ReaderWriterLockSlim 是一个用于实现多线程同步的类,它允许多个线程同时以只读方式访问共享资源,同时只允许一个线程以写入方式访问共享资源。UpgradeableReadLock 是一种特殊类型的读取锁,它允许线程在已获取的读取锁之上升级为写入锁。

在某些情况下,可能需要将 UpgradeableReadLock 降级为简单的 ReadLock。这可以通过调用 UpgradeableReadLockDowngradeToReadLock 方法来实现。这样做可以避免在释放升级的写入锁时导致其他线程获得写入锁的风险。

以下是一个简单的示例,展示了如何使用 ReaderWriterLockSlimUpgradeableReadLock 降级为简单的 ReadLock

代码语言:csharp
复制
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

    static void Main(string[] args)
    {
        Task.Run(() => SimulateUpgradeableReadLock());
        Task.Run(() => SimulateReadLock());

        Console.ReadLine();
    }

    static void SimulateUpgradeableReadLock()
    {
        _lock.EnterUpgradeableReadLock();
        Console.WriteLine("UpgradeableReadLock acquired");

        // Perform some operations

        _lock.DowngradeToReadLock();
        Console.WriteLine("Downgraded to ReadLock");

        // Perform some more operations

        _lock.ExitReadLock();
        Console.WriteLine("ReadLock released");
    }

    static void SimulateReadLock()
    {
        _lock.EnterReadLock();
        Console.WriteLine("ReadLock acquired");

        // Perform some operations

        _lock.ExitReadLock();
        Console.WriteLine("ReadLock released");
    }
}

在这个示例中,我们创建了一个 ReaderWriterLockSlim 实例,并在两个不同的线程中模拟了 UpgradeableReadLockReadLock 的使用。在 SimulateUpgradeableReadLock 方法中,我们首先获取 UpgradeableReadLock,然后将其降级为 ReadLock,并在完成操作后释放锁。在 SimulateReadLock 方法中,我们只获取 ReadLock 并在完成操作后释放锁。

总之,将 ReaderWriterLockSlimUpgradeableReadLock 降级为简单的 ReadLock 可以确保线程安全,避免不必要的锁升级和降级操作,从而提高应用程序的性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 多线程锁之ReaderWriterLockSlim

1、简介 .NET 3.5 开始 ReaderWriterLockSlim登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLock 升级版。...Read 和 Writer 锁定模式比较简单易懂:Read 模式是典型共享锁定模式,任意数量线程都可以在该模式下同时获得锁;Writer 模式则是互斥模式,在该模式下只允许一个线程进入该锁。...4、通过默认构造函数创建读写锁是不支持递归,若想支持递归 可通过构造 ReaderWriterLockSlim(LockRecursionPolicy) 创建实例。...10、降级状态:可升级读模式可以降级读模式:即在进入可升级读模式EnterUpgradeableReadLock后, 通过首先调用读取模式EnterReadLock方法,然后再调用 ExitUpgradeableReadLock...介绍,能大致得知道ReaderWriterLockSlim得用处,在多线程并发操作共享资源时,很有用处. 2、通过ReaderWriterLockSlim封装一个同步缓存实例 下面时MS提供封装,我做了略微修改

1.3K20

JUC系列(八)| 读写锁-ReadWriteLock

我们读操作相关锁,称为读锁,因为可以共享读,我们也称为“共享锁”,写操作相关锁,称为写锁、排他锁、独占锁。...二、案例实现 一个特别简单案例哈。...三、锁降级 概念: 锁降级意思就是写锁降级读锁。而读锁是不可以升级写锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成过程不能称之为锁降级。...0.75,则容量=750,大概估计每一个节点链表长度5个 * 那么数组长度大概:150,又有雨设置map大小一般2指数,则最近数字:128 */ private...锁降级必要性: 锁降级中读锁获取是否必要呢? 答案是必要

30920

concrrent类下ReentrantReadWriteLock类原理以及使用

cacheValid) { //其中一个线程进入判断,判断空 则进入if语句,然后读锁解锁 9 // Must release read lock before acquiring...29 } 30 } 31 } 以上代码加锁顺序: 1. rwl.readLock().lock(); 2. rwl.readLock().unlock(); 3. rwl.writeLock...cacheValid)是因为第二个、第三个线程获得读权利时也是需要判断是否空,否则会重复写入数据。 4. 写入数据后先进行读锁降级后再释放写锁。【加锁顺序序号:4和5 】 5....if(value == null){ //防止多写线程重复查询赋值 26 value = "redis-value"; //此时可以去数据库中查找,这里简单模拟一下...27 } 28 rwl.readLock().lock(); //加读锁降级写锁,不明白可以查看上面锁降级原理与保持读取数据原子性讲解

56630

ReadWriteLock场景应用解析

().unlock(); } } } 以上代码加锁顺序: 1. rwl.readLock().lock(); 2. rwl.readLock().unlock(); 3. rwl.writeLock...cacheValid)是因为第二个、第三个线程获得读权利时也是需要判断是否空,否则会重复写入数据。 4. 写入数据后先进行读锁降级后再释放写锁。【加锁顺序序号:4和5 】 5....0.75,则容量=750,大概估计每一个节点链表长度5个 * 那么数组长度大概:150,又有雨设置map大小一般2指数,则最近数字:128 */ private...if(value == null){ //防止多写线程重复查询赋值 value = "redis-value"; //此时可以去数据库中查找,这里简单模拟一下...} rwl.readLock().lock(); //加读锁降级写锁,不明白可以查看上面锁降级原理与保持读取数据原子性讲解

1.4K10

ReentrantReadWriteLock读写锁及其在 RxCache 中使用

WriteLock(this); } 在 Java 中所谓公平锁是指,每个线程在获取锁时,会先查看此锁维护等待队列,如果队列空或者当前线程线程是等待队列第一个,则占有锁。...写锁代码类似于读锁,但是在同一时刻写锁是不能被多个线程所获取,它是独占式锁。 写锁可以降级成读锁,下面会介绍锁降级。 1.3 锁降级降级是指先获取写锁,再获取读锁,然后再释放写锁过程 。...锁降级是为了保证数据可见性。锁降级是 ReentrantReadWriteLock 重要特性之一。 值得注意是,ReentrantReadWriteLock 并不能实现锁升级。 二....写操作之后,还需要进行读操作的话,可以使用锁降级。...、Room 给 Java 和 Android 构建一个简单响应式Local Cache

60720

juc并发编程05——读写锁

没有任意线程占用读锁情况下, 同一时间只有一个线程可以加写锁。 简单总结就是要么读,要么写,允许多个线程同时读,只允许一个线程单独写。看看源码。...公平锁简单演示如下。...下面讲点有意思:锁降级和锁升级。先回顾下我们对读写锁机制描述: 没有其它线程占用写锁情况下,同一时间可以有多个线程加读锁。 发现没有,我们用是其它,而不是任意。...不过上面的例子中写锁与读锁顺序不能反。再看之前我概念也是这么写。 没有任意线程占用读锁情况下, 同一时间只有一个线程可以加写锁。 为什么呢?其实是因为写锁可以降级读锁。...换句话说,我本来是写锁,看见是自己人来了(同一个线程想获取读锁),我把自己降级读锁,允许你进来和我玩。但是如果是读锁,即使我看见自己人来了,我也没有办法升级成为写锁阿。毕竟降级简单升级难。

18030

ReadWriteLock(读写锁)

ReadWriteLock ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程...读锁:共享锁 readLock **写锁:**独占锁 writeLock 读写锁 : 一个资源可以被多个读线程进行访问 ,或者可以被一个写线程访问, 但是不能同时存在读和写进程 ,读写互斥,读读共享...,可能一直读没有写操作 2.写时候,自己线程可以读,读时候,哪个线程都不可以写 锁降级降级:写入锁降级读锁 读锁不能升级写锁 获取写锁—>获取读锁—>释放写锁—>释放读锁 示例: public...(); //锁降级 //获取写锁 writeLock.lock(); System.out.println("飞飞");...(); //锁降级 //获取读锁 readLock.lock(); System.out.println("read读取");

41510

ReentrantReadWriteLock读写锁解析

cacheValid = true; } // 持有写锁情况下,获取读锁,称为 “锁降级” rwl.readLock...读写锁利用按位切割思想,巧妙地state分割两部分: 高16位:表示读状态,代表读锁获取次数【包括重入次数】,由于共享模式,可以有多个线程获取锁,且可以重入。...如果当前线程已经持有了该写锁则简单增加AQS状态值后直接返回true。...} } } 锁降级理解 锁降级就意味着写锁是可以降级读锁,但是需要遵循先获取写锁、获取读锁在释放写锁次序。...锁降级:先获取写锁,再获取读锁,再释放写锁,写锁就能降级读锁。 读写锁:读写锁允许同一时刻有多个读线程访问,但在写线程访问时,所有的读线程和其他写线程均被阻塞。

21450

搞定ReentrantReadWriteLock 几道小小数学题就够了

精美图文讲解Java AQS 共享式获取同步状态以及Semaphore应用 介绍 AQS 共享式获取同步状态实现,并说明了 Semaphore 是如何自定义同步器实现简单限流作用 有了以上两篇文章铺垫...现实中,读多写少业务场景是非常普遍,比如应用缓存 一个线程数据写入缓存,其他线程可以直接读取缓存中数据,提高数据查询效率 之前提到互斥锁都是排他锁,也就是说同一时刻只允许一个线程进行访问,当面对可共享读业务场景...= null; } 简单来说,如果请求读锁的当前线程发现同步队列 head 节点下一个节点排他式节点,那么就说明有一个线程在等待获取写锁(争抢写锁失败,被放入到同步队列中),那么请求读锁线程就要阻塞...cacheValid = true; } //在释放写锁前,降级读锁 rwl.readLock().lock(); } finally...首先获取读锁,如果cache不可用,则释放读锁 然后获取写锁 在更改数据之前,再检查一次cacheValid值,然后修改数据,cacheValid置true 然后在释放写锁前获取读锁 此时 cache

24130

Java多线程编程-(17)-读写锁ReentrantReadWriteLock深入分析

另外,我们还需要知道最简单同步关键字synchronized也是支持锁重入,但他和ReentrantLock相比,synchronized正如他加锁和释放锁一样都是隐式,在前几篇文章中也对比了关于...而ReentrantReadWriteLock实现了ReadWriteLock接口,那么他就是具体工厂接口实现类,ReadLock和WriteLock就成了具体产品实现类,一个简单工厂方法模式使用案例...正是由于锁降级存在,才会出现上图中高16位和低16都不为0,但可以确定是写锁问题。...虽然,为了保证数据可见性引入锁降级可以写锁降级读锁,但是却不可以锁升级,读锁升级写锁,也就是不会出现:当前线程已经获取到读锁了,通过某种方式增加写状态获取到写锁情况。...六、总结 1、读锁重入是允许多个申请读操作线程,而写锁同时只允许单个线程占有,该线程写操作可以重入。 2、如果一个线程占有了写锁,在不释放写锁情况下,它还能占有读锁,即写锁降级读锁。

53120

深入探索Java并发库(JUC)中ReentrantReadWriteLock

在Java并发编程世界中,锁是一种用于同步访问共享资源机制。Java并发库(JUC)我们提供了多种锁实现,每种都有其特定使用场景和优势。...公平锁意味着锁获取顺序按照线程请求锁顺序来,即遵循先来先服务原则;而非公平锁则不保证按照顺序分配锁,可能会导致某些线程长时间得不到锁。...锁降级:ReentrantReadWriteLock支持锁降级操作,即线程可以先获取写锁,然后释放写锁并获取读锁。这在某些场景下非常有用,比如线程在修改共享资源后需要读取修改后结果。...下面我简要概述其核心实现机制,并提供一些关键部分源码分析。...四、ReentrantReadWriteLock使用 下面是一个使用ReentrantReadWriteLock代码,其中包含一个共享资源(一个简单计数器),多个读线程和写线程并发地访问这个资源

6710

死磕Java并发:J.U.C之读写锁:ReentrantReadWriteLock

假如当前同步状态S,那么写状态等于 S & 0x0000FFFF(高16位全部抹去),读状态等于S >>> 16(无符号补0右移16位)。...getThreadId(Thread.currentThread()); } HoldCounter 定义非常简单,就是一个计数器count 和线程 id tid 两个变量。...从上面我们可以看到ThreadLocalHoldCounter绑定到当前线程上,同时HoldCounter也持有线程Id,这样在释放锁时候才能知道ReadWriteLock里面缓存上一个读取线程(...4、锁降级 上开篇是LZ就阐述了读写锁有一个特性就是锁降级,锁降级就意味着写锁是可以降级读锁,但是需要遵循先获取写锁、获取读锁在释放写锁次序。...= current) return -1; //读锁 int r = sharedCount(c); 锁降级中读锁获取释放必要? 肯定是必要

23260

【原创】Java并发编程系列18 | 读写锁(下)

上篇【原创】Java并发编程系列17 | 读写锁八讲(上),没看过可以先看看。本文是下篇,从“源码分析写锁获取与释放”开始。 7....置当前线程 return true; } 简单看下writerShouldBlock() writerShouldBlock():检查AQS队列中情况,看是当前线程是否可以获取写锁,返回false...写锁释放 写锁释放比较简单,跟之前重入锁释放基本类似,看下源码: public void unlock() { sync.release(1); } /** * 释放写锁,如果释放之后没有线程占用写锁...锁降级 读写锁支持锁降级。锁降级就是写锁是可以降级读锁,但是需要遵循获取写锁、获取读锁、释放写锁次序。 为什么要支持锁降级?...锁降级就是写锁是可以降级读锁,但是需要遵循获取写锁、获取读锁、释放写锁次序。 读写锁多用于解决读多写少问题,最典型就是缓存问题。

31220

花几分钟看一下 ReentrantReadWriteLock 原理!

- 锁降级 重入还允许从写锁降级读锁,通过先获取写锁,然后获取读锁,最后释放写锁方式降级。但是,从读锁升级到写锁是不可能。 - 锁获取中断 读锁和写锁都支持锁获取期间中断。...锁可以降级,从写锁降级读锁,但是不可能从读锁升级到写锁。...state 0 ,则当前线程 CAS 更新 state,获取锁。 更新成功之后绑定当前线程。 如果失败会继续调用 AQS acquireQueued,当前阻塞放在 AQS 队列中。...Q:当前线程获取锁失败,被阻塞后续操作是什么? A:获取失败,会放到 AQS 等待队列中,在队列中不断循环,监视前一个节点是否 head ,是的话,会重新尝试获取锁。 Q:锁降级是怎么降级?...读写锁都支持重入,读锁重入次数记录在线程维护 ThreadLocal 中,写锁维护在 state 上(低 16 位)。 支持锁降级,从写锁降级读锁,防止脏读。

32910

ReentrantReadWriteLock知识点梳理

所有 ReadWriteLock实现都必须保证 writeLock操作内存同步效果也要保持与相关 readLock联系。也就是说,成功获取读锁线程会看到写入锁之前版本所做所有更新。...支持可重入性 一个线程在获取了读锁后还可以获取读锁 一个线程在获取了写锁后,可以再次获取写锁也可以获取读锁; 锁降级,允许写锁降级读锁 其实现方式是:先获取写锁,然后获取读锁,然后释放写锁,业务操作,...提供很多方法,用于监控,数据采集 锁降级demo: class CachedData { Object data; volatile boolean cacheValid; final...cacheValid) { // 在获取写锁前,先把读锁释放,因为不允许读锁升级 rwl.readLock().unlock(); rwl.writeLock...cacheValid = true; } // 锁降级,在释放写锁前先获取读锁 rwl.readLock().lock();

30720

降级

运行结果 什么是读写锁降级? 先看段代码。代码演示是在更新缓存时候,如何使用读写锁降级。...,直接获取读锁,这就是读写锁降级。...大概流程就是先获取读锁读缓存,再释放读锁获取写锁,写锁修改缓存。然后重点来了,「线程在不释放写锁情况下,获取读锁(这就是锁降级)」,然后释放写锁。读锁读取数据,最后释放读锁。...「所以针对读多,写非常少任务,还是用锁降级比较明智」。 只支持降级,不支持升级 运行下面这段代码,「在不释放读锁情况下直接尝试获取写锁,也就是锁升级,会让线程直接阻塞,程序是无法运行」。...5、升降级策略 升降级策略:只能从写锁降级读锁,不能从读锁升级写锁。 巨人肩膀 https://kaiwu.lagou.com/course/courseInfo.htm?

1.3K10
领券