2015-01-30 3 views
1

스레드를 볼 수있는 값을 설정해야하는 변수가 있습니다. 나는 어떤 쓰레드가 글쓰기를하고 있는지 전혀 모른다.스레드가 표시되는 비 휘발성 멀티 스레드 쓰기

변수는 한 번만 설정되므로 volatile으로 설정하면 변수 값이 CPU 캐시에서 읽히지 않게됩니다 (또는 내 이해가됩니다). 한번 쓰고 많은 것을 읽으십시오.

final을 사용하기 위해이 변수를 생성자로 가져올 수 없습니다.

내 거친 흐름은 다음과 같습니다

public void setX(int value) { 
    Object o = new Object(); 
    synchronized(o) { 
     this.x = value; 
    } 
} 

그리고이 원칙-전에 일어나는의 값이 메모리에 기록되기 때문에 :

thread 1: set value x 
thread 1: fire notification to say x is ready. 
thread 2: read x. 

나의 이해는 다음 작업을 수행 할 수 있다는 것입니다 . 그 맞습니까?

+0

다시 시도 하시겠습니까? 'setX()'가 호출 될 때마다'o'가 다른 객체를 참조하기 때문에 – djb

+0

'synchronized (o)'는 예제에서 beforeHothing을 사용하지 않습니다. 동기화는 두 개 이상의 스레드가 _same_ 개체에서 동기화 할 때만 의미합니다. –

+0

@Cheetah 스레드 2가'x'가 스레드 1에서 설정 될 때까지 기다려야한다는 것을 이해합니다. 그러나 스레드 1이 스레드 2가'x'를 읽고 싶어 할 때까지 기다려야하는지 알고 싶습니다 ... –

답변

1

volatile으로 설정하지 마십시오. 엄지 규칙으로 해당 변수의 값이 변경되고 해당 변수에 대한 다중 스레드 읽기/쓰기 인 경우 volatile을 사용하십시오. 사용자의 경우 에 읽기를 캐시해야합니다. x의 값이으로 변경되지 않기 때문입니다. 휘발성 사용 성능 저하 귀하의 경우 set()get() 전에 발생하는지 확인하면됩니다. someThread이 다른 스레드에게 알리지 않으면 다른 스레드가 x의 값을 읽지 않기 때문에 실제로 발생합니다.

추신 : 알림이없는 한 다른 스레드가 x의 값을 읽지 않을 것이라고 가정합니다. 당신의 질문에 잘못이 있다면 알려주십시오.

+0

확실히 값은 여전히 ​​남아 있습니다. 캐쉬에 앉아있어. – Cheetah

+0

@Cheetah - 귀하의 스레드는 통보받지 않고이 값을 읽을 수 있습니까 *? – TheLostMind

+0

아니요, 휘발성이 아니며 스레드 1이 x 값을 설정하면 해당 값이 스레드 2가 읽을 수있는 알림을 가져올 때까지 메모리에 기록되지 않았을 수 있습니다 .... – Cheetah

0

메서드에서 만든 개체를 동기화하는 것은 무의미합니다. notify() 모든 독서 스레드는 스스로 대답해야하는 질문입니다.이 알림을 받기 위해 wait()을 보내시겠습니까? 값이 아직 설정되지 않은 경우 getter에서 null 또는 throw을 반환하는 것이 좋습니다 ...

+0

그는 알리지 않으려 고합니다. 그는 단지'x'가 "메인"메모리와 동기화되도록 확실히하고 싶습니다. 그러나 나는 그렇게하기위한 객체를 생성하는 것이 필요하지 않다는 것에 동의한다. 우리는'this'도 사용할 수있다. – sodik

관련 문제