wx.peng 2023-12-22 11:43 采纳率: 100%
浏览 1
已结题

ConcurrentLinkedQueue size为什么不使用一个原子变量

为何在 ConcurrentLinkedQueue 中需要遍历链表来获取 size而不使用一个原子变量呢?

我看到书里是这么写的:这是因为使用原子变量保存队列元素个数需要保证入队、出队操作和原子变量操作是原子性操作,而 ConcurrentLinkedQueue 使用的是 CAS 无锁算法所以无法做到这样。

但是我个人的理解是:CAS不是能保证一个变量的原子性嘛?
求各位技术大咖指点一下

  • 写回答

1条回答 默认 最新

  • wx.peng 2023-12-22 11:46
    关注

    哦,我好像知道了。

    简单的举一个例子,因为是没有加锁,正常的逻辑应该是要先加到队列,然后加对count 进行原子 + 1,这是两个步骤
    如果我在统计count的时候,刚好有一个线程已经把元素加到队列中,但是还没有对count进行原子操作,这个时候count的数量就会有问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 创建了问题 12月22日