синхронизировать без летучих - PullRequest
0 голосов
/ 13 октября 2018

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

Следующий код относится к состоянию гонки, и я удивляюсь, почему я никогда не видел, чтобы кто-то использовал переменную volatile для счетчика:

  public synchronized void add(int value){
      this.count += value;
  }

не должен быть здесь счетчик volatile?

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

1 Ответ

0 голосов
/ 13 октября 2018

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

public class Counter {
    @GuardedBy("this") private volatile int value;

    public int getValue() { return value; }

    public synchronized int increment() {
        return value++;
    }
}

Код использует синхронизированный, чтобы гарантировать, что операция приращения является атомарной и использует volatile, чтобы гарантировать видимость текущего результата.Если обновления происходят нечасто, этот подход может работать лучше, поскольку издержки на пути чтения составляют только volatile чтение, что, как правило, дешевле, чем получение блокировки.

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