gpt4 book ai didi

java - 尽管不使用锁定,但比较和设置如何工作

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:44 25 4
gpt4 key购买 nike

如前所述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 是如何工作的呢?

最佳答案

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

JVM在cpp调用中使用JNI来实现CAS,cpp CAS操作将编译为CPU汇编命令。所以对于单核多线程的场景,CPU每次都会自动调度并挑选一个线程。所以多线程不会有安全问题。

关于java - 尽管不使用锁定,但比较和设置如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56421501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com