求助, 为什么 Array 阻塞队列和 Linked 阻塞队列的锁不一样?

2019-09-17 14:46:05 +08:00
 monetto

ArrayBlockingQueue 的锁是读写不分离的。 而 LinkedBlockingQueue 的锁是读写分离的。这样就可以同时读和写了。 为什么要这么设计? 网上搜了一大圈答案都不太满意。

这里还有对 ArrayBlockingQueue 进行改造的。 https://blog.csdn.net/icepigeon314/article/details/93792519 貌似改造后效果还更好了, 为啥 Java 不一开始就这么设计?

3208 次点击
所在节点    Java
3 条回复
HelloAmadeus
2019-09-17 15:30:39 +08:00
从数据结构上理解哈。数据 queue 有一个 index,读写都得改这个 index,列表 queue 读改表头,写改表尾,互不干扰。
guyeu
2019-09-17 15:58:58 +08:00
一楼说的对了一半,ArrayBlockingQueue 有两个 index,一个是 takeIndex 用于读,一个是 putIndex 用于写,从 index 的角度,可以做成读写分离,问题在于还有一个整数 count,记录队列里元素的数量,不管是读还是写都要修改这个整数的值,所以不管读还是写都要锁一下。
LinkedBlockingQueue 用 AtomicInteger 来记录元素数量,这个读写不分离的锁被隐藏在了 AtomicInteger 里,锁的粒度更细了。而 ArrayBlockingQueue 在读写元素时的运算量很小,所以没必要用太细粒度的锁。
monetto
2019-09-19 08:18:01 +08:00
@HelloAmadeus
@guyeu
感谢感谢~~才看到

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/601522

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX