轻松写,这是什么意思?

时间:2017-09-18 13:17:46

标签: java java-memory-model

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);
    }

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

这是什么意思,轻松写?

1 个答案:

答案 0 :(得分:2)

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

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

const anotherTrack: PartiallySpecifiedTrack<{ foo: string }> = track;
declare const trackingInfo: TrackingInfo<{ foo: string }, {bar: number}>
anotherTrack(trackingInfo); // okay

sun.misc.Unsafestatic 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); } ... } 类的实例,其实现与ITEM类似的功能。现在,我们可以查看此方法的JavaDoc description并找到以下内容:

  

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

换句话说,我们可以得出结论,宽松写入普通写入访问相同。换句话说,我认为Michael上面的评论是正确的:

  

......它与volatile相反 - 写得无法保证   在线程中可以看到。

(参见相反的方法VarHandle,该方法就像声明变量sun.misc.Unsafe一样。)