CAS 是像自旋一样的循环吗?

anL*_*856 5 c++ java jvm

我在阅读sun.misc.Unsafe.Java.

CAS 是像自旋一样的循环吗?

起初,我认为CAS只是一种低生活方式的原子操作。但是,当我尝试查找函数的源代码时compareAndSwapInt,我发现 cpp 代码如下:

jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
    assert(sizeof(jbyte) == 1, "assumption.");
    uintptr_t dest_addr = (uintptr_t)dest;
    uintptr_t offset = dest_addr % sizeof(jint);
    volatile jint* dest_int = (volatile jint*)(dest_addr - offset);
    jint cur = *dest_int;
    jbyte* cur_as_bytes = (jbyte*)(&cur);
    jint new_val = cur;
    jbyte* new_val_as_bytes = (jbyte*)(&new_val);
    new_val_as_bytes[offset] = exchange_value;
    while (cur_as_bytes[offset] == compare_value) {
        jint res = cmpxchg(new_val, dest_int, cur);
        if (res == cur) break;
            cur = res;
        new_val = cur;
        new_val_as_bytes[offset] = exchange_value;
    }
    return cur_as_bytes[offset];
}
Run Code Online (Sandbox Code Playgroud)

我在这个原子函数中看到了“when”和“break”。

它是一种旋转方式吗?

相关代码链接:

http://hg.openjdk.java.net/jdk8u/jdk8u20/hotspot/file/190899198332/src/share/vm/prims/unsafe.cpp

http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/07011844584f/src/share/classes/sun/misc/Unsafe.java

http://hg.openjdk.java.net/jdk8u/jdk8u20/hotspot/file/55fb97c4c58d/src/share/vm/runtime/atomic.cpp

Eug*_*ene 4

CAS是一个返回值或 的单个操作,意味着该操作是否成功,因为您正在执行您希望该操作成功的操作,因此操作会重复,直到它起作用为止。10compareAndSwapInt

我认为您也将其与 a 混淆spin lock,这基本上意味着当该值为“1”时执行某些操作(例如);所有其他线程都会等待,直到该值为零(通过compareAndSwap),这实际上意味着某个线程完成了工作并释放了锁(这称为release/acquire语义)