Java基础复习 原子性 有序性 可见性
2019-09-25 本文已影响0人
pj0579
借鉴https://www.jianshu.com/p/2ecdddecefa6
原子性
:
拿自增操作举例子:
count++;
指令一:count从内存加载到cpu的寄存器
指令二:在寄存器中进行加一操作
指令三:最后写入缓存
指令四:刷新到主内存
这种情况会发生线程A执行完指令一,线程B接管执行count++时还是count的原来的值,原子操作可以保证指令一,指令二,指令三必定完成,要嘛一个都不执行。
对基本数据类型的变量的读取和赋值操作是原子性操作
有序性
拿对象创建举例子 会进行重排序
我们先看 instance = new Singleton() 的未被编译器优化的操作
指令 1:分配一块内存 M;
指令 2:在内存 M 上初始化 Singleton 对象;
指令 3:然后 M 的地址赋值给 instance 变量。
编译器优化后的操作指令
指令 1:分配一块内存 M;
指令 2:将 M 的地址赋值给 instance 变量;
指令 3:然后在内存 M 上初始化 Singleton 对象。
这种情况会发生线程A分配完内存分配给M,线程B获取对象时候指向为一个没有初始化的对象。
可见性
与原子性的区别
指令一:count从内存加载到cpu的寄存器
指令二:在寄存器中进行加一操作
指令三:最后写入缓存
指令四:刷新到主内存
变量volatile
修饰,可以保证指令三 四 一步完成