java的读写锁中锁降级的问题

原创 2018年04月15日 16:53:21

读写锁是什么我就不多说了,下面说什么是锁降级


锁降级:

锁降级指的是写锁降级成为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级。锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程。


锁降级的必要性:

锁降级中读锁的获取是否必要呢?答案是必要的。主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁, 假设此刻另一个线程(记作线程T)获取了写锁并修改了数据,那么当前线程无法感知线程T的数据更新。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。


这里要着重讲一讲“无法感知”是什么意思:

也就是说,在另一个线程(假设叫线程1)修改数据的那一个瞬间,当前线程(线程2)是不知道数据此时已经变化了,但是并不意味着之后线程2使用的数据就是旧的数据,相反线程2使用还是被线程1更新之后的数据。也就是说,就算我不使用锁降级,程序的运行结果也是正确的(这是因为锁的机制和volatile关键字相似)。

那么为什么还要锁降级呢,其实目的是为了减少线程的阻塞唤醒。明显当不使用锁降级,线程2修改数据时,线程1自然要被阻塞,而使用锁降级时则不会。“感知”其实是想强调读的实时连续性,但是却容易让人误导为强调数据操作。


有兴趣的可以参考下面的链接:

读写锁中 写锁的降级问题


JDK读写锁ReadWriteLock的升级和降级问题

JDK提供了写锁接口ReadWriteLock和它的实现ReentrantReadWriteLock。要实现一个读写锁,需要考虑很多细节,其中之一就是锁升级和锁降级的问题。什么是升级和降级呢?Read...
  • aitangyong
  • aitangyong
  • 2014-07-31 14:23:14
  • 4579

读写锁之——锁降级

锁降级指当前线程把持住写锁再获取到读锁,随后释放先前拥有的写锁的过程。 对于支持重入锁的同步器例如ReentrantReadWriteLock ,如果当前进程获取到了写锁是允许继续获取读锁的...
  • cauclilin
  • cauclilin
  • 2017-08-29 16:35:14
  • 364

Java并发编程艺术——ReentrantReadWriteLock(读写锁)

ReadWriteLock仅定义了获取读锁和写锁的两个方法,即readLock()方法和writeLock()方法,而其实现——ReentrantReadWriteLock,除了接口方法之外,还提供了...
  • yinbingqiu
  • yinbingqiu
  • 2017-04-08 17:21:39
  • 265

(多线程与并发)面试题03--java中读写锁ReadWriteLock

1.排他锁(互斥锁)的概念: synchronized,ReentrantLock这些锁都是排他锁,这些锁同一时刻只允许一个线程进行访问。 2.读写锁的概念: 分为读锁和写锁,多个读锁不互斥,读锁和写...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2015-12-27 15:43:13
  • 1666

5线程同步-实现读写锁扩展C++11标准库

在C++11标准库中实现了线程的重要基本设施,使用这些功能轻松构建复杂的多线程程序,但是比起微软或者第三库功能还是不怎么全面,比如读写锁就没有实现,但是可以利用已有的功能,轻松实现一个读写锁。代码如下...
  • pi314
  • pi314
  • 2016-11-21 11:43:20
  • 894

java多线程:并发包中ReentrantReadWriteLock读写锁的锁降级模板 写锁降级为读锁

java多线程:并发包中ReentrantReadWriteLock读写锁的锁降级模板 写锁降级为读锁,但读锁不可升级或降级为写锁。 锁降级是为了让当前线程感知到数据的变化。 1 //读写锁 ...
  • wscrf
  • wscrf
  • 2017-11-26 11:31:09
  • 165

Java中的读写锁模拟实现

翻译了一篇关于Java读写锁的文章,因为笔者之前也没有看过读写锁的相关内容,这里就算是边学习边翻译了,翻的可能不尽准确,高手见谅!好了,闲话少说,进入正题吧。 读/写锁比起"Java中...
  • u011638883
  • u011638883
  • 2014-01-22 22:15:19
  • 2734

轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理

前言前面介绍了java中排它锁,共享锁的底层实现机制,本篇再进一步,学习非常有用的读写锁。鉴于读写锁比其他的锁要复杂,不想堆一大波的文字,本篇会试图图解式说明,把读写锁的机制用另外一种方式阐述。...
  • yanyan19880509
  • yanyan19880509
  • 2016-09-04 22:08:32
  • 9534

c++11实现写优先的读写锁

先直接贴出代码: 可以看出用c++11实现读写锁变得非常简洁,在读取量非常大且写入频率很低的时候,通过一个简单的写入线程计数可以避免大量的 cond_w.notify_one();减少读取...
  • mymodian
  • mymodian
  • 2016-10-12 10:36:48
  • 3031

Java多线程中读写锁ReadWriteLock的使用

读写锁分为杜锁和xiesuo
  • lzm1340458776
  • lzm1340458776
  • 2014-06-01 14:10:26
  • 7612
收藏助手
不良信息举报
您举报文章:java的读写锁中锁降级的问题
举报原因:
原因补充:

(最多只允许输入30个字)