Java JUC - 目录
Java JUC - 目录
3.1 CAS 算法
3.1.1 简介
CAS (Compare-And-Swap)是一种硬件对并发的支持
,针对多处理器操作而设计的处理器中的一种特殊指令
,用于管理对共享数据的并发访问。
CAS 是一种无锁的非阻塞算法的实现。
CAS 包含了 3 个操作数:
需要读写的内存值 V
进行比较的值 A
拟写入的新值 B
当且仅当V的值等于A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作。
3.1.2 模拟实现
public class TestCompareAndSwap {
private static final int SIZE = 10;
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap();
for (int i = 0; i < SIZE; i++) {
new Thread(() -> {
int expectedValue = cas.get();
boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 101));
System.out.println(Thread.currentThread().getName() + ":" + b);
}).start();
}
}
}
class CompareAndSwap {
private int value;
public synchronized int get() {
System.out.println(Thread.currentThread().getName() + ":expectedValue = " + value);
return value;
}
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
System.out.println(Thread.currentThread().getName() + ":newValue = " + newValue);
System.out.println(Thread.currentThread().getName() + ":compareAndSet ========== success!");
this.value = newValue;
} else {
System.out.println(Thread.currentThread().getName() + ":compareAndSet ========== faild!");
}
return oldValue;
}
public synchronized boolean compareAndSet(int expectedValue, int newValue) {
return expectedValue == compareAndSwap(expectedValue, newValue);
}
}
3.2 原子变量
3.2.1 简介
- 类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,
此包中的类可将volatile值、字段和数组元素的概念扩展到那些也提供原子条件更新操作的类。
- 类 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类型提供适当的实用工具方法。
- AtomicIntegerArray、AtomicLongArray和 AtomicReferenceArray类进一步扩展了原子操作,对这些类型的数组提供了支持。这些类在为其数组元素提供volatile访问语义方面也引人注目,这对于普通数组来说是不受支持的。
核心方法:boolean compareAndSet(expectedValue, updateValue)
- java.util.concurrent.atomic 包下提供了一些原子操作的常用类:
- AtomicBoolean 、AtomicInteger 、AtomicLong 、AtomicReference
- AtomicIntegerArray 、AtomicLongArray
- AtomicMarkableReference
- AtomicReferenceArray
- AtomicStampedReference