正如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
怎么工作甚至都没有获得锁?
答案 0 :(得分:0)
CAS在多处理器CPU中使用锁定。对于单核处理器,CAS不会使用锁,因为即使在多线程中,CPU也会串行执行命令。
JVM通过在cpp调用中使用JNI来实现CAS,并且cpp CAS操作将编译为CPU汇编命令。因此,对于单核多线程方案,CPU每次都会自动调度并选择一个线程。因此,多线程不会出现任何安全问题。