Java 轻松写作,这是什么意思? 私有静态类节点{ 挥发性E项; 易失性节点; /** *构造新节点。使用轻松写入,因为项可以 *只有在通过CASNETX发布后才能看到。 */ 节点(E项){ 不安全。putObject(此,itemOffset,item); }

Java 轻松写作,这是什么意思? 私有静态类节点{ 挥发性E项; 易失性节点; /** *构造新节点。使用轻松写入,因为项可以 *只有在通过CASNETX发布后才能看到。 */ 节点(E项){ 不安全。putObject(此,itemOffset,item); },java,java-memory-model,Java,Java Memory Model,它来自java.util.concurrent.ConcurrentLinkedQueue.java 轻松编写是什么意思?这是一个好问题。但理解这个术语的线索在于……JDK 9,其中sun.misc.Unsafe已成为(或将成为-更合适的说法,请参见)公共API 在JDK 9中,您提到的相应位置实现如下: private static class Node<E> { volatile E item; volatile Node<E> next;

它来自
java.util.concurrent.ConcurrentLinkedQueue.java


轻松编写是什么意思?

这是一个好问题。但理解这个术语的线索在于……JDK 9,其中
sun.misc.Unsafe
已成为(或将成为-更合适的说法,请参见)公共API

在JDK 9中,您提到的相应位置实现如下:

private static class Node<E> {
    volatile E item;
    volatile Node<E> next;

    /**
     * Constructs a new node.  Uses relaxed write because item can
     * only be seen after publication via casNext.
     */
    Node(E item) {
        UNSAFE.putObject(this, itemOffset, item);
    }
静态最终类节点{
挥发性E项;
易失性节点;
/**
*构造包含项的节点。使用松弛写入,因为
*项目只能在通过CAS发布后才能看到。
*/
节点(E项){
项目集(本项目);
}
...
}
其中
ITEM
VarHandle
类的实例,该类实现了与
sun.misc.Unsafe
类似的功能。现在,我们可以查看此方法并找到以下内容:

将变量的值设置为newValue,内存语义为 设置为将变量声明为非易失性和非最终变量。 通常称为普通写访问

换句话说,我们可以得出结论,轻松写入与普通写入访问是一样的。换句话说,我相信上面的评论是正确的:

…它就像volatile的反面-一种不能保证的写入 通过线程可以看到


(请参阅相反的方法
setVolatile
,该方法的工作原理与声明变量
volatile
)类似。

这可能与此相关:。但不确定。我相信它类似于volatile的相反方法-不能保证在线程之间看到写入。
static final class Node<E> {
    volatile E item;
    volatile Node<E> next;

    /**
     * Constructs a node holding item.  Uses relaxed write because
     * item can only be seen after piggy-backing publication via CAS.
     */
    Node(E item) {
        ITEM.set(this, item);
    }
    ...
}