Комментарии к «Параллелизм на практике» - PullRequest
1 голос
/ 31 августа 2011
@ThreadSafe
public class SynchronizedInteger {
    @GuardedBy("this") private int value;
    public synchronized int get() { return value; }
    public synchronized void set(int value) { this.value = value; }
}

В книге написано:

Хороший способ думать о нестабильных переменных - представить, что они ведут себя примерно как класс SynchronizedInteger в листинге 3.3 замена чтения и записи переменной volatile на вызовы get и set.
...
Эта аналогия не точна; эффекты видимости памяти SynchronizedInteger на самом деле немного сильнее, чем у изменчивых переменных. Увидеть Глава 16.

Я проверил главу 16, но не нашел точного ответа - насколько именно гарантии видимости памяти сильнее?

1 Ответ

5 голосов
/ 31 августа 2011

Основное различие заключается в том, что volatile создает отношение "до того, как произошло", между записью в переменную volatile и последующим чтением из нее, тогда как synchronized создает отношения "до и после" между разблокировкой и последующей блокировкой.

Таким образом, в случае SynchronizedInteger создается связь «до того» между любыми последовательными операциями с вызовами SychrozniedInteger (т.е. get() и set()), и не имеет значения, являются ли они чтением или записью , Он отличается от поведения volatile int, которое обеспечивает «до и только» между записью и последующим чтением.

На самом деле я не могу представить какой-либо значимый пример, чтобы проиллюстрировать это различие, так что эти поведения действительно отличаются незначительно.

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