атомный инкремент длинной переменной? - PullRequest
9 голосов
/ 02 февраля 2012

если длинная переменная объявлена ​​как: -

частный энергозависимый длинный счетчик = 0;

теперь, если я увеличу ее, используя оператор предварительного увеличения, тогда будетоперация будет атомарной?

если да, то будет ли она более эффективной, чем java.util.concurrent.atomic.AtomicLong приращение объекта ??

Ответы [ 4 ]

17 голосов
/ 02 февраля 2012

volatile только ключевое слово решает проблему видимость . Вы должны использовать AtomicLong или synchronized метод / блок для атомарности ( атомарность в параллельном программировании ).

Еще одна статья, вышедшая сегодня: Демонстрация, когда требуется летучий

3 голосов
/ 02 февраля 2012

Оператор предварительного увеличения - , а не атомарный. Кроме того, увеличение volatile long, вероятно, будет менее эффективным, чем использование AtomicLong почти на всех платформах, поскольку последняя поддерживается аппаратно.

2 голосов
/ 02 февраля 2012

Изменчивая переменная не совпадает с атомарной переменной.

Для изменчивых переменных java-компилятор будет пытаться свести к минимуму перемешивание команд ради эффективности (не спрашивайте меня об этом..), чтобы избежать проблем с параллелизмом.

Атомные переменные явно создаются для атомарных операций, как в вашем случае, увеличивая переменную атомарно.

2 голосов
/ 02 февраля 2012

Короткий ответ - Нет. Вам нужно будет синхронизировать метод, который увеличивает счетчик, или, предпочтительно, использовать AtomicLong.

Для записи операторы ++ не являются атомарными даже для целых чисел.

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