2017-09-18 2 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

좋은 질문입니다. 그러나이 용어를 이해하는 데 대한 단서는 다음과 같습니다. JDK 9, sun.misc.Unsafe이 공개 API (here 참조)가되었거나 될 것입니다. 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을보고 다음을 찾을 수 있습니다

변수는 비 휘발성 및 비 최종 선언 된 경우 등 설정의 메모리 의미로는 NEWVALUE에 변수의 값을 설정합니다. 일반적으로 일반 쓰기 액세스라고합니다. 즉

, 우리는 편안한 쓰기일반 쓰기 액세스와 동일한 지, 결론을 내릴 수있다. 즉, 나는 위의 Michael의 논평이 옳다고 생각 :

... 그 휘발성의 반대 같은 - 스레드를 통해 볼 수 을 보장 할 수 없습니다 쓰기.

은 (변수 선언되었는지 volatile로 작동 대향 setVolatile 방법 참조).