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

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


锁降级:

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


锁降级的必要性:

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


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

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

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


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

读写锁中 写锁的降级问题


阅读更多
个人分类: java并发编程
上一篇二叉树深度优先和广度优先的两种遍历方式
下一篇队列同步器(AQS)源码分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭