尽管未使用锁定,但比较设置如何工作

时间:2019-06-03 05:17:48

标签: java compare-and-swap

正如elsewhere所述,类型AtomicIntegerAtomicLong等使用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怎么工作甚至都没有获得锁?

1 个答案:

答案 0 :(得分:0)

CAS在多处理器CPU中使用锁定。对于单核处理器,CAS不会使用锁,因为即使在多线程中,CPU也会串行执行命令。

JVM通过在cpp调用中使用JNI来实现CAS,并且cpp CAS操作将编译为CPU汇编命令。因此,对于单核多线程方案,CPU每次都会自动调度并选择一个线程。因此,多线程不会出现任何安全问题。