Есть ли преимущество использования AtomicLong, если вы только устанавливаете и получаете значение?

У меня есть потребность в длинной переменной экземпляра.
Эта переменная будет содержать некоторое время события (время в миллисекундах).
Если я только устанавливаю значения в это длинное и получаю значение,
Есть ли преимущество использования AtomicLong (и только его get () и set ()), а не long?

4 ответа

Посмотрите на документ AtomicLong

AtomicLong используется в приложениях, таких как порядковые номера с атомным приращением, и не может использоваться в качестве замены для Long.

Этот конкретный класс предназначен для использования в многопоточной среде для обеспечения безопасности потоков.

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

Да, есть свои преимущества.

  1. В многопоточной среде вы получите предсказуемые результаты между потоками.
  2. Это удобная изменчивая длина.

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

Преимущества нет, если примитивный long объявлен как volatile или если используется 64-битная JVM. Назначение простого (энергонезависимого) длинного в 32-битной JVM не является атомарным, поэтому один поток может начать присвоение (некоторые байты перемещаются в длинное, но не все), а затем другой поток может читать / получать доступ к длинному и длинному получить искаженное значение. В 64-битной JVM назначение и доступ являются атомарными. Точно так же, если вы объявите long как volatile, он будет назначен / доступен атомарно.

Если вы не используете его значение в своих собственных обновлениях, оно вам не нужно, но если вы намереваетесь сделать что-то вроде var.set(1+var.get()) и используете несколько потоков, есть, среди прочего, это возможность:

Поток 1: x=var.get(); х = х +1;

Поток 2: y=var.get(); у = у +1;

Поток 1: var.set (x);

Тема 2: var.set(y);

С этой последовательностью пользователь ожидает, что значение было увеличено на 2, но они увидят, что оно было увеличено только на 1

Другие вопросы по тегам