Java并发原语 - 比较和交换

时间:2013-12-26 07:48:59

标签: java

Java 5,引入了一些并发原语,如比较和交换,比较和设置(一起作为CAS)和其他一些。
据我所知,所有这些操作都保证是原子的。因此,对于每个这样的操作,似乎必须有一个JVM字节代码指令?

我正在浏览字节码指令列表,但没有找到像CAS这样的方法。

不确定,我说CAS必须有单字节代码指令,或者在java中执行/实现CAS机构有不同的方式吗?

2 个答案:

答案 0 :(得分:5)

  

因此,对于每个操作,似乎必须有一个JVM字节代码指令?

实际上,这些操作是作为本机代码方法实现的,这些方法使用特定于硬件的指令或指令序列来实现所需的语义。没有用于执行CAS操作的JVM字节码。

答案 1 :(得分:1)

从Java CAS操作看起来像是对类sun.misc.Unsafe的对象的本机方法调用。来自AtomicInteger

的示例
/**
 * Atomically sets the value to the given updated value
 * if the current value {@code ==} the expected value.
 *
 * @param expect the expected value
 * @param update the new value
 * @return true if successful. False return indicates that
 * the actual value was not equal to the expected value.
 */
public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

有关不安全的更多信息:https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe