java并发中读写锁实现的一个细节疑问。

面试题java并发中读写锁实现的一个细节疑问。
Kevin_Jia Staff asked 3 years ago

当一个线程先获取到读锁的时候,有另外的线程需要获取写锁,显然这个线程不能获取写锁,等待读状态为0才能获取到,那么如果同时有其他线程在永远不停的获取读锁,这个读状态永远都不为0,那么写线程是否会饿死呢?为了防止这种写锁可能会永远等待,饿死的情况出现是如何避免的?

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏
6 Answers
shaoyi Staff answered 3 years ago

写线程会饿死。
read时检查是否有写线程在等待,如果是read等待。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 回答java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏
shaoyi Staff answered 3 years ago

写线程会饿死。
read时检查是否有写线程在等待,如果是read等待

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 回答java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏
ashitaka Staff replied 2 years ago

饿死我了

休息的风 Staff answered 7 months ago

其实只要设置为公平锁就能避免写锁饿死了

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Answer for java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏
hongweig Staff replied 7 months ago

可否详细的解释一下为何设置为公平锁就可以避免写锁饿死了呢?
我的理解是,如果读锁在获取了锁之后,写锁就会被放入等待队列,您的意思是写锁和读锁同在一个等待队列吗?还是说读锁在获取锁的时候,先查看是否有写锁呢?

v5code Staff answered 7 months ago

为什么不使用读、写队列 或者读前检查写 设置优先级

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Answer for java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏
MageekChiu Staff answered 3 months ago

确实会饿死,所以jdk8引入了StampedLock

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Answer for java并发中读写锁实现的一个细节疑问。

FavoriteLoading添加本文到我的收藏

return top