--------> CAS原理
i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”
从变量i中读取读取i的值->值+1 ->将+1后的值写回i中
程序:开启10个线程,打印 serialNumber
结果:在多次执行情况下,可能出现
尽管serialNumber加上了valotile,因为volatile无法保证原子性,所以程序(serialNumber++)不能保证线程安全。
线程 5 执行 int temp = i,线程6也执行到这一步,两个线程获取了相同的值
java.util.concurrent.atomic 包下------AtomicInteger 使用CAS保证数据变量的原子性
CAS(Compare-And-Swap) 算法保证数据变量的原子性
- CAS 算法是硬件对于并发操作的支持
- CAS 包含了三个操作数:
- ①内存值 V
- ②预估值 A
- ③更新值 B
- 当且仅当 V == A 时, V = B; 否则,不会执行任何操作。
两个线程都尝试去改同一个值,当一个线程先改完,另一个线程发现新的值和原来的不一样了,此时放弃操作。