2017-09-18 14 views
3
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

これは、これに関連している可能性があります:https://www.wikiwand.com/en/Consistency_model#/Relaxed_Memory_Consistency_Models。確かに。 – sp00m

+1

私はそれが揮発性の反対のように信じています - スレッド間で見られることが保証されていない書き込みです。 – Michael

答えて

2

良い質問です。しかし、この用語を理解するための手がかりは... sun.misc.Unsafeが公開APIになった(または具体的にはhereを参照してください)JDK 9にあります。 JDK 9あなたは次のように実現されることをいう対応する場所において

ITEMsun.misc.Unsafeと同様の機能を実装VarHandleクラスのインスタンスである

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

。今、私たちは、この方法のJavaDoc descriptionを見て、次の項目を見つけることができます:

は、変数が非揮発性および非finalとして宣言されたかのよう 設定のメモリセマンティクスで、newValueに、変数の値を設定します。 プレーン・ライト・アクセスとも呼ばれます。言い換えれば

、我々はリラックス書き込みプレーンな書き込みアクセスと同じであることを、結論付けることができます。スレッド間で見られるように を保証するものではありません書き込み - その揮発性の反対のように...

:他の言葉では、私は上記のMichaelの解説が右であると信じています。

(変数がvolatile宣言されたかのように動作し、反対方法setVolatileを参照されたいです)。