volatile
简单来说,volatile保存内存可见性。
线程一和二从主内存中复制flag到自己的工作内存。
当线程一修改flag的值,线程二并不会立即从主内存中读取flag的值,所以在线程二的工作内存中,flag依然为false。
使用volatile关键字,告示JVM此变量是不稳定的,每次使用它都要到主内存中读取。
除了保证内存可见性,volatile还能防止指令重排序,但并不能保证原子性。
Atomic
原子性:不可分割。多线程情况下,一个操作一旦开始就不会被其他线程干扰。
Atomic通过CAS(Compare And Swap)保证原子性。
由于没有阻塞、上下文切换,性能相较于Syn较高。
AtomicInteger原理:
使用CAS+volatile,
// 使用volatile修饰value
private volatile int value;
AtomicInteger使用volatile修饰value,JVM总是能在任何时刻拿到value最新的值。CAS原理是,拿期望的值和原本的值作比较,如果相同则可以更改。
Atomic的几种类型:
基本类型
使用原子的方式更新基本类型
- AtomicInteger:整形原子类
- AtomicLong:长整型原子类
- AtomicBoolean:布尔型原子类
数组类型
使用原子的方式更新数组里的某个元素
- AtomicIntegerArray:整形数组原子类
- AtomicLongArray:长整