hot*_*zen 15 java size queue concurrency
阅读Java的ConcurrentLinkedQueue Docs,我想知道为什么实现不可能存储大小:
请注意,与大多数集合不同,size方法不是恒定时间操作.由于这些队列的异步性质,确定当前元素数量需要遍历元素.
凡来源是这样的"异步性"?我只看到一个while循环来重试排队,直到AtomicReferences匹配预期的值/引用.为什么size:AtomicInteger
在成功向队列提供值后无法增加?
非常感谢.
想象一下,你有两个线程,一个添加一个新项目,另一个删除一个项目.一开始队列中没有项目.
假设第一个线程添加项目,紧接着另一个线程删除项目并减小大小,此时大小为-1,然后第一个线程将大小增加到0.
一个有点人为的例子,但你需要使整个操作成为原子,以确保没有其他线程可以访问-1的大小.
性能的重要优势之一ConcurrentLinkedQueue
来自这样的事实,即您在更新琴头时不必担心尾巴,反之亦然,对吗?
基本上,这意味着2个线程可以同时进行轮询/提供而不会产生干扰(即,队列大小不为0时)。
如果您有柜台,情况并非如此。即使它AtomicInteger
具有良好的并发性,您仍然会增加CAS操作失败的可能性,因为现在您有了这个“热点”,每次执行轮询/报价时都会更新该“热点”。
不能完全确定作者在说“异步性质”时是否有这个意思,但是我认为这是他们没有您建议的计数器的最大原因。
归档时间: |
|
查看次数: |
4806 次 |
最近记录: |