【发布时间】:2019-06-03 05:17:48
【问题描述】:
如elsewhere 所述,AtomicInteger、AtomicLong 等类型使用 CAS。 CAS 不使用锁定,它本质上是非常乐观的。它遵循以下步骤:
1) 将原始值与我们手头的值进行比较。 2)如果值不匹配,则意味着中间的某个线程已更改该值。否则它将继续并用新值交换值。
public final long incrementAndGet()
{
for (;;) {
long current = get();
long next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
假设两个线程 T1 和 T2 将当前值读取为 1,并且都尝试将值增加到 2。现在,两个线程同时到达行,即 if (compareAndSet(current, next)) 并尝试更新平行线。如果没有锁定机制,那么两个线程都应该成功并返回 2。但这不会发生。
那么,compareAndSet 在没有获得锁的情况下如何工作?
【问题讨论】:
-
做最少的研究通常会有所帮助:en.wikipedia.org/wiki/Compare-and-swap。而真正的东西是cpu操作
cmpxchg8b / cmpxchg16b。
标签: java compare-and-swap