为何在 ConcurrentLinkedQueue 中需要遍历链表来获取 size而不使用一个原子变量呢?
我看到书里是这么写的:这是因为使用原子变量保存队列元素个数需要保证入队、出队操作和原子变量操作是原子性操作,而 ConcurrentLinkedQueue 使用的是 CAS 无锁算法所以无法做到这样。
但是我个人的理解是:CAS不是能保证一个变量的原子性嘛?
求各位技术大咖指点一下
为何在 ConcurrentLinkedQueue 中需要遍历链表来获取 size而不使用一个原子变量呢?
我看到书里是这么写的:这是因为使用原子变量保存队列元素个数需要保证入队、出队操作和原子变量操作是原子性操作,而 ConcurrentLinkedQueue 使用的是 CAS 无锁算法所以无法做到这样。
但是我个人的理解是:CAS不是能保证一个变量的原子性嘛?
求各位技术大咖指点一下
哦,我好像知道了。
简单的举一个例子,因为是没有加锁,正常的逻辑应该是要先加到队列,然后加对count 进行原子 + 1,这是两个步骤
如果我在统计count的时候,刚好有一个线程已经把元素加到队列中,但是还没有对count进行原子操作,这个时候count的数量就会有问题。