一、volatile关键字
Java 允许线程访问共享变量,为了确保共享变量能被准确、一致地更新,线程应该确保通过排他锁单独获得这个变量。Java 提供了关键字 volatile,如果一个变量被声明成 volatile,那么对这个变量写入或者读取时就不需要加锁,Java 线程内存模型能确保所有线程看到这个变量的值是一致的。能让其他线程能够马上感知到某一线程对某个变量的修改。
二、volatile关键字的作用
volatile 关键字的作用主要体现在两方法方面:保证可见性和保证有序性
保证可见性也就是保证了共享变量的“可见性”,可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
保证有序性是对 volatile 修饰的变量,volatile 之前的代码不能调整到他的后面,volatile 之后的代码不能调整到他的前面。
三、volatile与synchronized的异同
volatile 是轻量级的 synchronized,如果 volatile 变量修饰符使用恰当的话,它比 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。
相同点在于二者均可保证可见性和有序性。
不同点主要体现在以下几个方面:
(1)用法不同。volatile 只能修饰变量;synchronized 只能修饰方法或语句块。
(2)对原子性的保证。volatile不能保证原子性,synchronized 可以保证原子性。
(3)实现原理不同。volatile 对变量加了 lock,synchronized 使用 monitor。
(4)volatile 不会引起阻塞,synchronized 会引起阻塞。
四、参考资料
【1】张振华 Java并发编程从入门到精通[M] 清华大学出版社
【2】放腾飞 魏鹏 程晓明 Java并发编程的艺术[M] 机械工业出版社
【3】https://www.jianshu.com/p/d577c2817af8
【4】https://blog.csdn.net/vking_wang/article/details/9982709
【5】https://www.jianshu.com/p/6efe8d5bd567