введение
Java предоставляет java.util.concurrent.atomic пакет с JDK1.5, который облегчает программистам выполнять атомные операции без замков в многопоточной среде. В основном уровне атомных переменных используются атомные инструкции, предоставленные процессором, но различные архитектуры ЦП могут предоставлять различные атомные инструкции, а также могут потребовать некоторую форму внутренней блокировки, поэтому этот метод не может абсолютно убедиться, что поток не заблокирован.
Введение атомного пакета
В пакете атомного пакета есть 12 классов, и четыре метода атомного обновления: атомные обновления базовых типов, массивы атомного обновления, ссылки на атомное обновление и поля атомного обновления. Классы в атомном пакете - это в основном оберщенные классы, реализованные с использованием небезопасных.
Атомное обновление базового класса типа
Для обновления основных типов с помощью атомных методов, атомный пакет предоставляет следующие три класса:
Atomicboolean: Атомные обновления логического типа.
AtomicInteger: Атомное обновление целочисленное.
Atomiclong: Атомное обновление длинное целое число.
Общие методы AtomicInteger заключаются в следующем:
int addandget (int delta): добавляет входное значение к значению в экземпляре (значение в AtomicInteger) атомно и возвращает результат
BOOLEAN COMPAREANDSET (int ожидайте, int update): если входное значение равно ожидаемому значению, установите значение на входное значение атомно.
int getAndIncrement (): добавляет текущее значение в 1 атомно. ПРИМЕЧАНИЕ. Возвращенное значение здесь - это значение перед автоинскручением.
void lazyset (int newvalue): в конечном итоге он будет установлен в NewValue. После использования Lazyset для установления значения другие потоки все еще могут прочитать старое значение int getandset (int newvalue): он устанавливается на значение newValue атомно и возвращает старое значение.
Пример примера AtomicInteger заключается в следующем:
Import java.util.concurrent.atomic.atomicinteger; открытый класс Atomicintegertest {static atomicinteger ai = new Atomicinteger (1); Public Static void Main (String [] args) {System.out.println (ai.getAndinCrement (); System.out.out.ous.ous.println (ai.getandincrement (););Выход
12
Десерт после ужина
Атомный пакет предоставляет три основных типа атомных обновлений, но базовые типы Java включают в себя Char, Float и Double. Итак, вопрос в том, как обновить другие основные типы атомов? Классы в атомном пакете в основном реализованы с использованием небезопасного. Давайте посмотрим на исходный код небезопасного. Мы обнаружили, что небезопасность предоставляет только три метода CAS, ComparandsWobobject, ComparandSwapint и CompareandSwaplong. Затем посмотрите на исходный код Atomicboolean. Мы обнаружили, что он сначала преобразует Boolean в целое число, а затем использует CompareAndswapint для CAS, поэтому атомное обновление также может быть реализовано с использованием аналогичных идей.
Класс массива атомного обновления
Атомный пакет содержит следующие три класса:
Atomicintegerarray: атомно обновляет элементы в целочисленном массиве.
Atomiclongarray: Атомные обновления элементы в длинных массивах.
AtomicReferenceArray: Атомные обновления элементы в массиве эталонного типа.
Класс Atomicintegerarray в основном предоставляет атомную обновление целых чисел в массиве. Обычно используемые методы следующие
int addandget (int i, int delta): добавляет входное значение атомно в индекс элементов I в массив.
BOOLEAN COMPAREANDSET (int i, int ожидайте, int update): если текущее значение равно ожидаемому значению, элемент в позиции массива I атомно устанавливается на значение обновления.
Пример кода заключается в следующем:
открытый класс AtomicIntegerarRayTest {static int [] value = new int [] {1, 2}; статический AtomicIntegerArray ai = new atomicintegerarray (значение); public void main (string [] args) {ai.getandSet (0, 0, 3); System.out.println (ai.get (0)); System.out.println (value [0]);}}Выход
31
Что вам нужно отметить в классе Atomicintegerarray, так это то, что значение массива передается через метод конструктора, а затем Atomicintegerarray скопирует текущий массив копию, поэтому, когда Atomicintegerarray модифицирует элементы внутреннего массива, это не повлияет на пропущенную массив.
Тип ссылки на атомное обновление
Atomicinteger, который является основным типом, может обновить только одну переменную. Если вы хотите обновлять несколько переменных атомно, вам необходимо использовать этот атом для обновления класса, предоставленного типом ссылки. Атомный пакет содержит следующие три класса:
AtomicReference: Atomic обновляет тип ссылки.
AtomicReferenceFieldupdater: Поля атомных обновлений в типе ссылки.
AtomicmarkableReerference: Атомные обновления типа ссылки с маркерами. Вы можете атомно обновить бит тега логического типа и тип ссылки. Метод строительства - AtomicMarkAbleReerference (v initialRef, boolean initalmark)
Код для использования AtomicReference заключается в следующем:
Общедоступный класс AtomicReferenceTest {public Static AtomicReference <user> atomicuserRef = new AtomicReference </user> <user> (); public static void main (string [] args) {пользователь пользователь = новый пользователь ("conan", 15); Atomicuserref.set (user); пользователь -обновление = новый пользователь ("Shinich 17); AtomicuserRef.compareAndset (пользователь, UpdateUser); System.out.println (atomicuserRef.get (). GetName ()); System.out.println (atomicuserRef.get (). Getold ());} Static Class пользователь {Private Spend; Private Int Old; Old;} public String getName () {return name;} public int getOld () {return Old;}}}Выход
Shinichi17
Полевой класс атомного обновления
Если нам нужно только определенное поле в определенном классе, нам нужно использовать Atomic для обновления полевого класса. Атомный пакет содержит следующие три класса:
Atomicintegerfieldupdater: обновляющий поля, которые атомно обновляют целые числа.
Atomiclongfieldupdater: обновление для атомных обновлений длинные целочисленные поля.
AtomicStampedReference: Атомные обновления типа ссылки с номером версии. Этот класс связывает целочисленные значения с ссылками и может использоваться для атомного большего количества данных и номеров версий, которые могут решить проблемы ABA, которые могут возникнуть при использовании CAS для атомных обновлений.
Полевые классы атомного обновления являются абстрактными классами, и каждый раз, когда они используются, они должны использовать статический метод Newupdater для создания обновления. Общественный летучий модификатор должен использоваться для поля класса атомного обновления.
Первый шаг заключается в том, что, поскольку классы поля атомного обновления являются абстрактными классами, каждый раз, когда вы используете статический метод Atomicintegerfieldupdater.newupdater, вы должны создать обновляющий, и вам необходимо установить классы и свойства, которые вы хотите обновить. Второй шаг состоит в том, чтобы обновить поля (свойства) класса, должны использовать общественный летучий модификатор (частный летучий int old)
Пример кода Atomicintegerfieldupdater заключается в следующем:
открытый класс AtomicIntegerFieldUpdaterTest {Private Static AtomicIntegerFieldUpdater <user> a = atomicintegerfieldupdater.newupdater (user.class, "old"); 10); System.out.println (a.getandIncrement (conan)); System.out.println (a.get (conan));} public Static Class User {private String name; public ved old; public user (string name, int old) {this.name = name; this.old = old;} public String getName () {return name;} public;Выход
1011
Суммировать
Выше приведено все содержание этой статьи о введении и использовании многопоточного атомного пакета Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Введение в метод написания потребительской модели производства в различных условиях в многопоточной чтении Java
Java Многопользованное программирование синхронизатор будущее и примеры файла FutureTask и кодовые примеры
Подробное объяснение Java Multicreded Dislay Lock и встроенной блокировки
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это.