Перейти к содержимому

Atomiclong java что это

  • автор:

Atomiclong java что это

A long значение, которое может быть обновлено атомарно. См. java.util.concurrent.atomic спецификация пакета для описания свойств атомарных переменных. AtomicLong используется в приложениях, таких как атомарно постепенно увеличенные порядковые номера, и не может использоваться в качестве замены для a Long . Однако, этот класс действительно расширяется Number предоставить универсальный доступ инструментами и утилитами, которые имеют дело с в цифровой форме на основе классами.

Сводка конструктора

Создает новый AtomicLong с начальным значением 0 .
Создает новый AtomicLong с данным начальным значением.

Сводка метода

Методы

Модификатор и Тип Метод и Описание
long addAndGet(long delta)

Атомарно добавляет данное значение к текущей стоимости.

Атомарно устанавливает значение в данное обновленное значение если текущая стоимость == математическое ожидание.

Атомарно декременты одним текущая стоимость.
Возвращает значение конкретного количества как a double .
Возвращает значение конкретного количества как a float .
Получает текущую стоимость.
Атомарно добавляет данное значение к текущей стоимости.
Атомарно декременты одним текущая стоимость.
Атомарно инкременты одним текущая стоимость.
Атомарно наборы к данному значению и возвратам старое значение.
Атомарно инкременты одним текущая стоимость.
Возвращает значение конкретного количества как int .
В конечном счете наборы к данному значению.
Возвращает значение конкретного количества как a long .
Наборы к данному значению.
Возвращает Строковое представление текущей стоимости.

Атомарно устанавливает значение в данное обновленное значение если текущая стоимость == математическое ожидание.

Методы java.lang унаследованный от класса. Число

Методы java.lang унаследованный от класса. Объект

Деталь конструктора

AtomicLong
public AtomicLong(long initialValue)

Создает новый AtomicLong с данным начальным значением.

AtomicLong
public AtomicLong()

Создает новый AtomicLong с начальным значением 0 .

Деталь метода

добраться
public final long get()

Получает текущую стоимость.

набор
public final void set(long newValue)

Наборы к данному значению.

lazySet
public final void lazySet(long newValue)

В конечном счете наборы к данному значению.

getAndSet
public final long getAndSet(long newValue)

Атомарно наборы к данному значению и возвратам старое значение.

compareAndSet
public final boolean compareAndSet(long expect, long update)

Атомарно устанавливает значение в данное обновленное значение если текущая стоимость == математическое ожидание.

weakCompareAndSet
public final boolean weakCompareAndSet(long expect, long update)

Атомарно устанавливает значение в данное обновленное значение если текущая стоимость == математическое ожидание. Может перестать работать побочно и не обеспечивает гарантии упорядочивания, так только редко соответствующая альтернатива compareAndSet .

getAndIncrement
public final long getAndIncrement()

Атомарно инкременты одним текущая стоимость.

getAndDecrement
public final long getAndDecrement()

Атомарно декременты одним текущая стоимость.

getAndAdd
public final long getAndAdd(long delta)

Атомарно добавляет данное значение к текущей стоимости.

incrementAndGet
public final long incrementAndGet()

Атомарно инкременты одним текущая стоимость.

decrementAndGet
public final long decrementAndGet()

Атомарно декременты одним текущая стоимость.

addAndGet
public final long addAndGet(long delta)

Атомарно добавляет данное значение к текущей стоимости.

toString
public String toString()

Возвращает Строковое представление текущей стоимости.

intValue
public int intValue()

Описание скопировало с класса: Number
Возвращает значение конкретного количества как int . Это может включить округление или усечение.

longValue
public long longValue()

Описание скопировало с класса: Number
Возвращает значение конкретного количества как a long . Это может включить округление или усечение.

floatValue
public float floatValue()

Описание скопировало с класса: Number
Возвращает значение конкретного количества как a float . Это может включить округление.

doubleValue
public double doubleValue()

Параллелизм Java – класс AtomicLong

Класс java.util.concurrent.atomic.AtomicLong обеспечивает операции с базовым длинным значением, которые могут быть прочитаны и записаны атомарно, а также содержит расширенные атомарные операции. AtomicLong поддерживает атомарные операции с базовой переменной long. У него есть методы get и set, которые работают как чтение и запись по переменным переменным. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. У атомарного метода compareAndSet также есть эти особенности согласованности памяти.

Методы AtomicLong

Ниже приведен список важных методов, доступных в классе AtomicLong.

public long addAndGet (длинная дельта)

Атомно добавляет данное значение к текущему значению.

public boolean compareAndSet (долгое ожидание, долгое обновление)

Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

общедоступный long декремент AndGet ()

Атомно уменьшает на единицу текущее значение.

public double doubleValue ()

Возвращает значение указанного числа в виде двойного числа.

публичный float floatValue ()

Возвращает значение указанного числа в виде числа с плавающей запятой.

публичный длинный get ()

Получает текущее значение.

public long getAndAdd (длинная дельта)

Atomiclly добавляет данное значение к текущему значению.

public long getAndDecrement ()

Атомно уменьшает на единицу текущее значение.

public long getAndIncrement ()

Атомно увеличивает на единицу текущее значение.

public long getAndSet (long newValue)

Атомно устанавливает заданное значение и возвращает старое значение.

public long incrementAndGet ()

Атомно увеличивает на единицу текущее значение.

public int intValue ()

Возвращает значение указанного числа в виде целого числа.

public void lazySet (long newValue)

В конце концов устанавливается на заданное значение.

public long longValue ()

Возвращает значение указанного числа в виде long.

открытый набор void (long newValue)

Устанавливается на заданное значение.

public String toString ()

Возвращает строковое представление текущего значения.

public boolean weakCompareAndSet (долгое ожидание, долгое обновление)

Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

public long addAndGet (длинная дельта)

Атомно добавляет данное значение к текущему значению.

public boolean compareAndSet (долгое ожидание, долгое обновление)

Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

общедоступный long декремент AndGet ()

Атомно уменьшает на единицу текущее значение.

public double doubleValue ()

Возвращает значение указанного числа в виде двойного числа.

публичный float floatValue ()

Возвращает значение указанного числа в виде числа с плавающей запятой.

публичный длинный get ()

Получает текущее значение.

public long getAndAdd (длинная дельта)

Atomiclly добавляет данное значение к текущему значению.

public long getAndDecrement ()

Атомно уменьшает на единицу текущее значение.

public long getAndIncrement ()

Атомно увеличивает на единицу текущее значение.

public long getAndSet (long newValue)

Атомно устанавливает заданное значение и возвращает старое значение.

public long incrementAndGet ()

Атомно увеличивает на единицу текущее значение.

public int intValue ()

Возвращает значение указанного числа в виде целого числа.

public void lazySet (long newValue)

В конце концов устанавливается на заданное значение.

public long longValue ()

Возвращает значение указанного числа в виде long.

открытый набор void (long newValue)

Устанавливается на заданное значение.

public String toString ()

Возвращает строковое представление текущего значения.

public boolean weakCompareAndSet (долгое ожидание, долгое обновление)

Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

пример

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

import java.util.concurrent.atomic.AtomicLong; public class TestThread  static class Counter  private AtomicLong c = new AtomicLong(0); public void increment()  c.getAndIncrement(); > public long value()  return c.get(); > > public static void main(final String[] arguments) throws InterruptedException  final Counter counter = new Counter(); //1000 threads for(int i = 0; i  1000 ; i++)  new Thread(new Runnable()  public void run()  counter.increment(); > >).start(); > Thread.sleep(6000); System.out.println("Final number (should be 1000): " + counter.value()); > >

Это даст следующий результат.

Atomiclong java что это

«Устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.» В меморис.

Николай Уровень 22
31 октября 2023

а зачем нужен volaile если при выходе из синхронизированного метода и сбрасываются значения в основную память, а при заходе — читаются из основной памяти?

Aseevim2015@gmail.com Уровень 37
19 октября 2023

Алгоритм использует низкоуровневые машинные инструкции, такие как сравнение и замена (CAS, compare-and-swap, что обеспечивает целостность данных и по ним уже существует большое количество исследований). Типичная операция CAS работает с тремя операндами: Место в памяти для работы (M) Существующее ожидаемое значение (A) переменной Новое значение (B), которое необходимо установить CAS атомарно обновляет M до B, но только если значение M совпадает с A, в противном случае никаких действий предприниматься не будет. В первом и втором случае вернут значение М. — Что это? Какие случаи? Это письмо из Простоквашино дяде Федору?))

Igor Уровень 108 Expert
17 августа 2023

В примере нет строки где создают и инициализируют объект AtomicInteger с именем atomicInteger и значением 0. Поэтому так сложно читать код, особенно кто еще не очень хорошо понимает лямбды и method reference.

Надежда Уровень 104 Expert
3 августа 2023

Последняя задача. Вот output (один из возможных), если применить готовое решение автора задачи. Чтобы выполнялось требование и вывод на экран заканчивался фразой «Did someone hit? true», предложу вот такое решение (дать потоку, который первым «стреляет», немного времени, чтобы он полностью отработал блок кода и поменял значение флага на true. Трех миллисекунд на это должно хватить, и последний зашедший поток «увидит», что флаг true и выведет в консоль):

Gregory Parfer Уровень 82 Expert
20 февраля 2023

Последняя задача не проходит валидацию, пишет что «Вывод на экран должен заканчиваться фразой «Did someone hit? true»», при подстановке «правильного решения» все то же самое

Java Blog

Пакет java.util.concurrent.atomic — это набор классов, поддерживающих неблокирующее поточно-ориентированное программирование для отдельных переменных. По сути, классы в этом пакете расширяют понятие volatile значений, полей и элементов массива до тех, которые также обеспечивают атомарную операцию условного обновления формы:

boolean compareAndSet(expectedValue, updateValue);

Этот метод (который различается по типам аргументов в разных классах) атомарно устанавливает переменную updateValue, если она в настоящее время содержит ожидаемое значение, возвращая true в случае успеха. Классы в этом пакете также содержат методы для получения и безоговорочной установки значений, а также более слабую операцию условного атомарного обновления weakCompareAndSet.

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

Каждый из экземпляров классов AtomicBoolean, AtomicInteger, AtomicLong и AtomicReference обеспечивает доступ и обновления к одной переменной соответствующего типа. Каждый класс также предоставляет соответствующие служебные методы для этого типа. Например, классы AtomicLong и AtomicInteger предоставляют методы атомарного приращения. Одно из применений — создание порядковых номеров, например:

class Sequencer < private final AtomicLong sequenceNumber = new AtomicLong(0); public long next() < return sequenceNumber.getAndIncrement(); >>

Несложно определить новые служебные функции, которые, как и getAndIncrement, атомарно применяют функцию к значению. Например, учитывая некоторую трансформацию

long transform(long input)

можно написать следующее:

long getAndTransform(AtomicLong var) < long prev, next; do < prev = var.get(); next = transform(prev); >while (!var.compareAndSet(prev, next)); return prev; // return next; для transformAndGet >

Эффекты памяти для доступа и обновления атомарных переменных обычно соответствуют правилам для volatile, как указано в Спецификации языка Java (модель памяти 17.4):

  • get имеет эффекты памяти при чтении volatile переменной.
  • set имеет эффекты памяти записи (назначения) volatile переменной.
  • lazySet имеет эффекты памяти записи (назначения) volatile переменной, за исключением того, что он позволяет переупорядочивать с последующими (но не предыдущими) действиями с памятью, которые сами по себе не накладывают ограничений переупорядочения с обычными не-volatile записями. Среди других контекстов использования lazySet может применяться при обнулении для сбора мусора ссылки, к которой больше никогда не будет доступа.
  • weakCompareAndSet атомарно считывает и записывает переменную по условию, но не создает каких-либо упорядоченных операций (happens-before orderings), поэтому не дает никаких гарантий относительно предыдущих или последующих операций чтения и записи любых переменных, кроме цели weakCompareAndSet.
  • compareAndSet и все другие операции чтения и обновления, такие как getAndIncrement, имеют эффекты памяти как чтения, так и записи volatile переменных.

В дополнение к классам, представляющим отдельные значения, этот пакет содержит классы Updater, которые можно использовать для получения операций compareAndSet в любом выбранном volatile поле любого выбранного класса. AtomicReferenceFieldUpdater, AtomicIntegerFieldUpdater и AtomicLongFieldUpdater — это утилиты на основе отражения, которые обеспечивают доступ к связанным типам полей. В основном они используются в атомарных структурах данных, в которых несколько volatile полей одного и того же узла (например, ссылки узла дерева) независимо подвергаются атомарным обновлениям. Эти классы обеспечивают большую гибкость в том, как и когда использовать атомарные обновления, за счет более неуклюжей настройки на основе отражения, менее удобного использования и более слабых гарантий.

Классы AtomicIntegerArray, AtomicLongArray и AtomicReferenceArray дополнительно расширяют поддержку атомарных операций для массивов этих типов. Эти классы также примечательны тем, что предоставляют семантику volatile доступа для своих элементов массива, которая не поддерживается для обычных массивов.

Атомарные классы также поддерживают метод weakCompareAndSet, который имеет ограниченную применимость. На некоторых платформах weak версия может быть более эффективной, чем compareAndSet в обычном случае, но отличается тем, что любой конкретный вызов метода weakCompareAndSet может ложно возвращать false значение (то есть без видимой причины). Возврат false означает только то, что операцию можно повторить при желании, полагаясь на гарантию того, что повторный вызов, когда переменная содержит ожидаемое значение и ни один другой поток также не пытается установить переменную, в конечном итоге будет успешным. (Такие ложные сбои могут быть, например, из-за эффектов конкуренции за память, которые не связаны с тем, равны ли ожидаемые и текущие значения.) Кроме того, weakCompareAndSet не обеспечивает гарантии упорядочения, которые обычно необходимы для управления синхронизацией. Однако этот метод может быть полезен для обновления счетчиков и статистики, когда такие обновления не связаны с другими событиями, происходящими до упорядочения программы. Когда поток видит обновление атомарной переменной, вызванное weakCompareAndSet, он не обязательно видит обновления любых других переменных, которые произошли до weakCompareAndSet. Это может быть приемлемо, например, при обновлении статистики производительности, но редко в противном случае.

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

Атомарные классы разработаны в первую очередь как строительные блоки для реализации неблокирующих структур данных и связанных классов инфраструктуры. Метод compareAndSet не является общей заменой блокировки. Он применяется только тогда, когда критические обновления объекта ограничиваются одной переменной.

Атомарные классы не являются заменой общего назначения для java.lang.Integer и связанных классов. Они не определяют такие методы, как equals, hashCode и compareTo. (Поскольку ожидается, что атомарные переменные будут видоизменяться, они не подходят для ключей хэш-таблицы.) Кроме того, классы предоставляются только для тех типов, которые обычно используются в предполагаемых приложениях. Например, не существует атомарного класса для представления байта. В тех редких случаях, когда вы хотели бы это сделать, вы можете использовать AtomicInteger для хранения байтовых значений и соответствующего преобразования. Вы также можете хранить float, используя преобразования Float.floatToRawIntBits(float) и Float.intBitsToFloat(int), и double с помощью преобразований Double.doubleToRawLongBits(double) и Double.longBitsToDouble(long).

  • Spring Resource: контексты приложения и пути ресурсов, создание контекстов приложения
  • Spring Resource: предостережения относительно FileSystemResource
  • Модульное (юнит) тестирование в Spring

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *