Volatile
简单来说,volatile保存内存可见性。
防止指令重排序:讲人话就是防止编译后java会按照一定规则和把指令重新排序优化执行
强制读主存:讲人话就是jvm虚拟机会有线程内存副本,线程间的共享变量可能无法察觉对 方的变化.
1、 线程一和二从主内存中复制flag到自己的工作内存。
2、 当线程一修改flag的值,线程二并不会立即从主内存中读取flag的值,所以在线程二的
工作内存中,flag依然为false»
3、 使用volatile关键字,告示JVM此变量是不稳定的,每次使用它都要到主内存中读取。
4、 除了保证内存可见性,volatile还能防止指令重排序,但并不能保证原子性。
Atomic
volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。
同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用
synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。
原子性:不可分割。多线程情况下,一个操作一旦开始就不会被其他线程干扰。
Atomic通过CAS (Compare And Swap)保证原子性,由于没有阻塞、上下文切换,性能相较于
Syn较高。
Atomic的几种类型:
基本类型
使用原子的方式更新基本类型
AtomicInteger:整形原子类
AtomicLong:长整型原子类
AtomicBoolean:布尔型原子类
数组类型
使用原子的方式更新数组里的某个元素
AtomicIntegerArray:整形数组原子类
AtomicLongArray:长整形数组原子类
AtomicReferenceArray:引用类型数组原子类
引用类型
AtomicReference:引用类型原子类
AtomicStampedReference:原子更新引用类型里的字段原子类
AtomicMarkab1eReference :原子更新带有标记位的引用类型
对象的属性修改类型
AtomicIntegerFieldUpdater:原子更新整形字段的更新器
AtomicLongFieldUpdater:原子更新长整形字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来, 可用于解决原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的 ABA问题。
使用 volatile 和 Atomiclnteger 的对比:
Was this helpful?
0 / 0