java 降级锁的理解

原文:https://blog.csdn.net/qiuwenjie123/article/details/79950532 

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

锁降级:

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

锁降级的必要性:

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

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

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

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

一些优秀的回答:

首先你没理解读写锁的意义,读锁的存在意味着不允许其他写操作的存在。
按照你提供的例子,可能存在一个事务线程不希望自己的操作被别的线程中断,而这个事务操作可能分成多部分操作更新不同的数据(或表)甚至非常耗时。如果长时间用写锁独占,显然对于某些高响应的应用是不允许的,所以在完成部分写操作后,退而使用读锁降级,来允许响应其他进程的读操作。只有当全部事务完成后才真正释放锁。
按你的理解如果当中写锁被其他线程占用,那么这个事务线程将不得不中断等待别的写锁释放。

所以总结下锁降级的意义应该就是:在一边读一边写的情况下提高性能。



 

猜你喜欢

转载自blog.csdn.net/zheng199172/article/details/88818607
今日推荐