原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量。
.png)
原子变量使用volatile修饰
.png)
原子变量使用了volatile 和CAS算法
* 1. volatile 保证内存可见性 不能保证原子性 原子性指不可分割
* 2. CAS(Compare-And-Swap) 算法保证数据变量的原子性
* CAS 算法是硬件对于并发操作的支持
* CAS 包含了三个操作数:
* ①内存值 V
* ②预估值 A
* ③更新值 B
* 当且仅当 V == A 时, V = B; 否则,不会执行任何操作。(保证了原子性)
仅仅使用volatile关键字修饰变量
.png)
.png)
仅仅使用volatile关键字 出现了违背线程安全的原子性
.png)
正确的做法 使用原子变量 满足 线程安全的原子性 可见性
.png)

1 package com.wf.zhang.juc; 2 3 import java.util.concurrent.atomic.AtomicInteger; 4 5 public class TestAtomicDemo { 6 7 8 public static void main(String[] args) { 9 AtomicDemo ad = new AtomicDemo(); 10 11 for (int i = 0; i < 10; i++) { 12 new Thread(ad).start(); 13 } 14 } 15 16 } 17 18 class AtomicDemo implements Runnable{ 19 20 //private volatile int serialNumber = 0; 21 22 private AtomicInteger serialNumber = new AtomicInteger(0); 23 24 @Override 25 public void run() { 26 27 try { 28 Thread.sleep(200); 29 } catch (InterruptedException e) { 30 } 31 32 System.out.println(getSerialNumber()); 33 } 34 35 public int getSerialNumber(){ 36 37 //return serialNumber++; 38 39 return serialNumber.getAndIncrement(); //得到值并且自增 40 } 41 42 43 }