2016-10-18 5 views
0

서로 다른 스레드에서 액세스 할 수있는 두 개의 변수 var1var2이있는 스레드 클래스가 있습니다. var2을 사용하여 synchronized getter and setter를 사용하는 경우 volatilevar1을 사용하는 것과 같습니다.휘발성 변수 및 동기 setter 및 getter

public class Processor extends Thread 
{ 
    public volatile boolean var1 = false 
    private boolean var2 = false 

    synchronized boolean getVar2() 
    { 
     return var2; 
    } 

    synchronized boolean setVar2 (boolean value) 
    { 
     return var2=value; 
    } 


    public void run() 
    { 
     ... 
    } 
} 
+0

변수를 휘발성으로 설정하는 것은 사용자가 요구하는 경우 동기화 대신 사용할 수 없습니다. – imrichardcole

+0

그 세터의 몸 뒤에있는 생각은 무엇입니까? 'return var2 = value;'이것은 비정상적인 것이므로 달성하고자하는 것을 알아야합니다. – weston

+0

또한 var1은 final이 아닌 public boolean입니다. 위 코드가 실제 코드인지 또는 예제를 보여줄지는 확실하지 않지만 아마도 나쁜 소식 일 것입니다. – imrichardcole

답변

1

예, 두 개는 동일한 메모리 가시성입니다. 당신은 어떤 check-then-set을해야만한다면 synchronized이 제공하는 자동화를 잃어 버리게됩니다.

1

이 경우 예. 두 동기화 된 블록 모두 값을 읽고 쓰지 않기 때문입니다.

값 변경에 반응하고 싶다고 가정하면 현재 값을 읽고 값을 읽어야합니다. 이를 위해 volatile은 적합하지 않습니다.

synchronized void setVar(boolean value) { 
    if (var != value) { 
    var = value; 
    someOnChangeMethod(); 
    } 
}