Параллелизм Java - класс AtomicBoolean
Класс java.util.concurrent.atomic.AtomicBoolean предоставляет операции с базовым логическим значением, которое может быть прочитано и записано атомарно, а также содержит расширенные атомарные операции. AtomicBoolean поддерживает атомарные операции с базовой логической переменной. У него есть методы получения и установки, которые работают как чтение и запись для изменчивых переменных. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. Атомарный метод compareAndSet также имеет эти функции согласованности памяти.
Методы AtomicBoolean
Ниже приводится список важных методов, доступных в классе AtomicBoolean.
Sr. No. | Метод и описание |
---|---|
1 | public boolean compareAndSet(boolean expect, boolean update) Атомарно устанавливает значение для данного обновленного значения, если текущее значение == ожидаемое значение. |
2 | public boolean get() Возвращает текущее значение. |
3 | public boolean getAndSet(boolean newValue) Атомарно устанавливает заданное значение и возвращает предыдущее значение. |
4 | public void lazySet(boolean newValue) В конце концов устанавливается на заданное значение. |
5 | public void set(boolean newValue) Безоговорочно устанавливается на заданное значение. |
6 | public String toString() Возвращает строковое представление текущего значения. |
7 | public boolean weakCompareAndSet(boolean expect, boolean update) Атомарно устанавливает значение для данного обновленного значения, если текущее значение == ожидаемое значение. |
пример
Следующая программа TestThread показывает использование переменной AtomicBoolean в среде на основе потоков.
import java.util.concurrent.atomic.AtomicBoolean;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
new Thread("Thread 1") {
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()
+" Waiting for Thread 2 to set Atomic variable to true. Current value is "
+ atomicBoolean.get());
if(atomicBoolean.compareAndSet(true, false)) {
System.out.println("Done!");
break;
}
}
};
}.start();
new Thread("Thread 2") {
public void run() {
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
System.out.println(Thread.currentThread().getName() +
" is setting the variable to true ");
atomicBoolean.set(true);
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
};
}.start();
}
}
Это даст следующий результат.
Вывод
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2, Atomic Variable: false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2 is setting the variable to true
Thread 2, Atomic Variable: true
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Done!