Имеет ли значение фактическая блокировка при принятии решения об использовании volatile? - PullRequest
7 голосов
/ 06 февраля 2012

Скажите, у меня есть следующий код:

private Integer number;
private final Object numberLock = new Object();

public int get(){
    synchronized(number or numberLock){
        return Integer.valueOf(number);
     }
}

У меня такой вопрос, должны ли следующие версии метода add иметь number как энергозависимые в следующих случаях:

public void add(int num){
    synchronized(number)
        number = number + num;
}

public void add(int num){
    synchronized(numberLock)
        number = number + num;
}

Я понимаю, что это обе атомарные операции, но мой вопрос в том, является ли значение number guarennteed выдаваемым в глобальную память и видимым для всех потоков без использования volatile?

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

- это значение числа, которое гарантированно выгружается в глобальную память и отображается для всех потоков без использования volatile?

Да.синхронизация предлагает видимость также.На самом деле синхронизация обеспечивает видимость и атомарность, а изменчивость - только видимость.

1 голос
/ 06 февраля 2012

Вы не синхронизировали get, поэтому ваш код не является потокобезопасным:

public int get(){
    return Integer.valueOf(number);
}

Кроме того, синхронизация гарантирует видимость, как уже заметил Евгений.

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