一、前言

今天给大家总结下volatile关键字作用,因为面试官在提问中一定会问你volatile和synchronized关键字的用法和不同之处。

Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。

二、首先说一下synchronized

同步块大家都比较熟悉,通过synchronized关键字来实现,所有加上synchronized和块语句,在多线程访问的时候,同一时刻只能有一个线程能够用。而volatile关键字在某些情况下性能是优于synchronized关键字的,但是它无法替代synchronization关键字的,因为volatile关键字无法保证操作的原子性。

三、再说一下volatile

用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。

volatile关键字是无法保证对变量操作的原子性。

1、volatile的两层语言:

(1)保证了不同的线程对变量操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是立即可见的。
(2)禁止进行指令重新排序。

2、使用volatile关键字后的区别:

(1)使用volatile关键字会强制将修改的值写入主内存中。
(2)使用volatile关键字,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存无效。

线程工作内存和主内存 工作内存和主内存

3、在那些情况下,volatile关键字可以代替锁:

要使用volatile变量提供线程安全,必须满足下面两个条件

(1)对变量写操作不依赖于当前值。
(2)该变量没有包含在具有其他变量的不变式中。

四、总结volatile关键字和synchronization关键字的区别:

(1)volatile仅能使用在变量级别;synchronization则可以使用在变量、方法和类级别。
(2)volatile标记变量不会被编译器优化;synchronization可以被编译器优化。