java - 读写锁中 写锁的降级问题
问题描述

写锁降级的时候 要求当前已经获取到写锁的线程把持住写锁,然后获取读锁,随后释放写锁。
那么为什么要求把持住写锁呢??
上图中提到 “ 那么当前线程无法感知线程T的数据更新 ” 这个如何理解。如果线程T获取到了写锁,然后对数据进行了更新,在没有释放写锁之前,当前线程无法感知到数据的更新,这个是没问题的吧,但是一旦线程T释放 写锁,那么当前线程就可以感知到数据的更新了,这里理解应该没问题吧?
help me to explain,thx
问题解答
回答1:这是在解释锁降级吧,首先写锁是独占的,读锁是共享的,然后读写锁是线程间互斥的,锁降级的前提是所有线程都希望对数据变化敏感,但是因为写锁只有一个,所以会发生降级。如果先释放写锁,再获取读锁,可能在获取之前,会有其他线程获取到写锁,阻塞读锁的获取,就无法感知数据变化了。所以需要先hold住写锁,保证数据无变化,获取读锁,然后再释放写锁。
回答2:写锁不允许其他进程的读写操作,读锁的允许读操作。就按你抓图的例子来看,当你释放写锁后,T进程获取了写锁,这时你就无法获取读锁了,所以要先获取读锁后,再释放写锁。
首先你没理解读写锁的意义,读锁的存在意味着不允许其他写操作的存在。按照你提供的例子,可能存在一个事务线程不希望自己的操作被别的线程中断,而这个事务操作可能分成多部分操作更新不同的数据(或表)甚至非常耗时。如果长时间用写锁独占,显然对于某些高响应的应用是不允许的,所以在完成部分写操作后,退而使用读锁降级,来允许响应其他进程的读操作。只有当全部事务完成后才真正释放锁。按你的理解如果当中写锁被其他线程占用,那么这个事务线程将不得不中断等待别的写锁释放。
回答3:“ 那么当前线程无法感知线程T的数据更新 ”
T1 读取 数据 Data时,将数据值复制到当前线程的上下文,因此其他线程没有办法感知数据是否更新。只要当数据提交内存中,即Heap中,其他线程才可以得到最新值。
相关文章:
1. python小白 想做一个能够计算圆周率的代码,不知道怎么写2. 如何用python求差商?3. css - 元素跟随鼠标轻微移动效果,求指教实现方法?4. 我想问下在华为android 6.0的手机上修改EditText光标颜色不成功,但是小米6.0上却能成功,这该如何解决????5. mysql - JAVA怎么实现一个DAO同时实现查询两个实体类的结果集6. python字符编码转换7. Android 打好 Signed包后 无法安装8. 想做一个Android app,但是背景不能铺满整个页面,不知道大家是用什么样的图片?9. node.js - session怎么存到cookie,然后服务器重启后还能获取。数据库不用mongodb或redis,数据库是mysql10. 如何让ul标签改变颜色

网公网安备