Java Springjava进阶干货Java学习笔记

Java--volatile的实现原理

2017-08-25  本文已影响83人  芒果味的你呀

引入

“如果向一个变量写入值,这个变量可能会被另一个线程读取,或者在从另一个变量读值,而这个变量可能之前被另一个线程写入的。所以必须需要同步。”

有的时候为了读写一个或两个实例域就使用同步,显得开销过大。如果一个变量使用volatile,则它比使用synchronized的成本更加低。因为它不会引起线程上下文的切换和调度。

我们先从操作系统角度分析volatile:

从并发的三个概念角度分析volatile:

首先先分析这三个概念:
原子性: 多个线程执行一个操作时,其中任何一个线程要么完全执行完此操作,要么没有执行此操作的任何步骤,那么这个操作就是原子的。在多线程环境下,可以通过synchronized 锁机制来保证原子性。

注意volatile不是原子性的。

可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

voliatile是可见性的

当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,当其他线程读取共享变量时,它会直接从主内存中读取。当然,synchronize和锁都可以保证可见性。

有序性:即程序执行的顺序按照代码的先后顺序执行。在Java内存模型中,为了效率是允许编译器和处理器对指令进行重排序,当然重排序它不会影响单线程的运行结果,但是对多线程会有影响。
volatile禁止指令重排序

Java提供volatile来保证一定的有序性

从java内存模型角度分析volitile

我们将 Java 内存模型中的主内存类比为 RAM(cpu主存),工作内存类比为 CPU的高速缓存。工作内存并非独立存在的一段内存空间,它是对CPU的寄存器、高速缓存及其他硬件的抽象描述。

image.png
上一篇 下一篇

猜你喜欢

热点阅读