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
这是什么意思,轻松写?
答案 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.Unsafe
是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);
}
...
}
类的实例,其实现与ITEM
类似的功能。现在,我们可以查看此方法的JavaDoc description并找到以下内容:
将变量的值设置为newValue,其内存语义为 设置好像变量被声明为非易失性和非最终变量。 通常称为普通写访问。
换句话说,我们可以得出结论,宽松写入与普通写入访问相同。换句话说,我认为Michael上面的评论是正确的:
......它与volatile相反 - 写得无法保证 在线程中可以看到。
(参见相反的方法VarHandle
,该方法就像声明变量sun.misc.Unsafe
一样。)