1 何为原子变量(Atomic)
1 计算机中的Atomic是指不能分割的最小单位。
2 JKD1.5之后java.util.concurrent.atomic包下提供了原子变量,主要的原子变量如下:
-- AtomicBoolean
-- AtomicInteger
-- AtomicIntegerArray
-- AtomicIntegerFieldUpdater
-- AtomicLong
-- AtomicLongArray
-- AtomicLongFieldUpdater
-- AtomicMarkableReference
-- AtomicReference
-- AtomicReferenceArray
-- AtomicReferenceFieldUpdater
-- AtomicStampedReference
3 原子变量的原子性由CAS(Compare and swap)算法保障原子性
/**
* 多线程原子变量递增示例
* 保证了原子性
*/
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class TestAtomic {
public static void main(String[] args) {
TestIncrement testIncrement = new TestIncrement();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(testIncrement);
threads.add(thread);
thread.start();
}
// 等待所有线程执行完
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(testIncrement.getNum());
}
}
class TestIncrement implements Runnable {
private AtomicInteger num = new AtomicInteger(0);
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
num.incrementAndGet();
}
}
public AtomicInteger getNum() {
return num;
}
}
2 CAS算法
1 Java中原子变量的cas操作是由底层硬件保障的。
2 CAS的原理:顾名思义(比较并交换),即与期望值比较如果相同则交换并返回结果,否则重试直到成功为止。
3 优点:是一种乐观锁(区别于synchronized同步锁的一种乐观锁),使用非阻塞算法执行效率高。
4 主要缺点:高并发下如果与期望值比较成功率较低的情况下,会增加循环重试数,会给CPU带来额外开销。