目录
Java并发有三大特性:1)可见性,即一个线程中对共享变量操作的结果对另一个线程看见;2)有序性,多线程环境下执行的结果与顺序执行的结果一致;3)原子性,即一组操作要么全部执行完毕,要么都不执行。
为了保证多线程环境下,对共享变量的访问不存在竞争,需要通过同步来保证线程在访问共享变量时是顺序执行的。volatile是Java中的轻量级同步机制。本文将从以下几个方面来介绍volatile。
1、volatile的特性
2、volatile的内存语义
3、volatile的实现原理
一、volatile的特性
volatile的第一个特性是可见性。对于单一操作是原子的,但是不能保证符合操作的原子性,通常用于线程通信。在Java锁的实现中,也大量利用了volatile的可见性。
volatile的第二个特性是禁止指令重排序,对声明为volatile的变量在编译后,插入内存屏障来实现。内存屏障主要有两个作用:一个是禁止内存屏障前的指令被编译器优化重排序到内存屏障后或者将内存屏障之后的指令优化重排序到内存屏障之前,第二个则是实现volatile的内存语义。内存屏障具体可以参考由鼎鼎大名的Doug Lea写的《JSR-133 cook book》。
二、volatile的内存语义
volatile读,将失效线程本地缓存,从主存重新读取值;
volatile写,将把线程本地缓存的值刷新到主存。
三、volatile实现原理
书上讲,volatile是通过转换为汇编语言之后,在声明为volatile的变量的指令后加上Lock前缀的指令实现的,前文介绍了如果通过hidis查看Java字节码转换为汇编语言,具体可参考《如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码》。对比下图代码,发现的确是在指令后边谈价了lock前缀的指令。
那么lock主要起什么作用呢?1)将当前处理器缓存回写到主存;2)这个回写会失效其他处理器的缓存。
参考:
《Java并发编程的艺术》