精确解释java的volatile之可见性、原子性、有序性(通过汇编语言)
一、实验环境: 1、Idea代码编辑器 2、jdk1.8.0_92 3、win10_x64 二、易产生误解的Java字段Volatile volatile保证了可见性,但是并不保证原子性!!! 1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 volatile的可见性,即任何时刻只要有任何线程修改了volatile变量的值,其他线程总能获取到该最新值。具体更多实现可以参阅缓存一致性协议。 2.那么volatile为什么又不能保证原子性呢? 以volatile int i = 10;i++;为例分析: i++实际为load、Increment、store三个操作。 某一时刻线程1将i的值load取出来,放置到cpu缓存中,然后再将此值放置到寄存器A中,然后A中的值自增1(寄存器A中保存的是中间值,没有直接修改i,因此其他线程并不会获取到这个自增1的值)。如果在此时线程2也执行同样的操作,获取值i==10,自增1变为11,然后马上刷入主内存。此时由于线程2修改了i的值,实时的线程1中的i==10的值缓存失效,重新从主内存中读取,变为11