Гарантирует ли создание изменяемого класса переменные класса volatile - PullRequest
2 голосов
/ 06 марта 2011

Предположим, что следующий синглтон:

public class Test{
    private static volatile Test test = null;
    private static int test_int = 0;
    private static String test_string = "test";

    public int getInt(){
       return test_int;
    }

    public String getString(){
        return test_string;
    }

    private static Test getInstance(){
         if(test == null){
             synchronized(Test.class){
                if(test == null)
                    test = new Test();
             }
         }
    }

Объявляя экземпляр Singleton Test как volatile, test_int и test_string также считаются volatile или они должны быть объявлены как таковые?Я хочу думать, что, сделав сам класс изменчивым, тогда все в этом классе также будет изменчивым ... однако я не уверен в этом.Спасибо заранее.

1 Ответ

9 голосов
/ 06 марта 2011

Нет, они не считаются изменчивыми. Только переменная test является изменчивой. После того, как значение test было получено (через getInstance), его волатильность не имеет отношения к остальному поведению клиента.

Лично я бы подумал, если честно, использовать AtomicInteger и AtomicReference вместо volatile. Я не знаю ни о ком другом, но я нахожу изменчивое поведение трудно надежным.

Обратите внимание, что вы, вероятно, не хотите, чтобы ваши test_int и test_string переменные были статическими ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...