2016-10-18 7 views
0

У меня есть класс потока, который имеет две переменные var1 и var2, к которым могут обращаться из разных потоков. Можно ли предположить, что использование var2 через synchronized геттер и сеттер - это то же самое, что и без них volatilevar1?Неустойчивая переменная и синхронизированный сеттер и 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 является не конечным общедоступным логическим, но не уверен, что приведенный выше код является реальным или просто демонстрирует пример, но это, вероятно, плохие новости ... – imrichardcole

ответ

1

Да, эти два эквивалента отображают видимость памяти. Вы теряете автоматичность, которую предлагает synchronized, если вам нужно выполнить чек-то-набор.

1

В этом случае да. Поскольку ни синхронизированный блок не считывает и не записывает значение.

Предположим, что мы хотим отреагировать на изменение значения, которое потребует как считывания текущего значения, так и записи нового. Для этого volatile не подходит:

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