Java基础

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修饰,可以保证指令三 四 一步完成

上一篇下一篇

猜你喜欢

热点阅读