java代码最终会被类加载器加载到JVM中,然后转化为汇编指令在CPU上执行。java中所使用的并发机制依赖于JVM的实现和CPU的指令。

1.volatile的应用

volatile是一个轻量级的synchronize,它保证了共享变量的可见性,确保了所有线程看到这个变量的值是一致的——变量一经修改所有的线程都可知道,都可以获得共享变量的最新值。但是volatile并不能保证原子性。

1.1为何会存在可见性问题?

CPU为了提高处理速度,并不会直接和内存进行通信,而是存在着多级内部缓存。第一次访问内存中的某个数据,会先将内存中的数据读取到CPU缓存中,下次再访问时,就直接可以访问缓存而不是重新读取内存,修改时,也可以直接修改缓存中的数据。但是,缓存中的数据写回到内存中是不确定的,因此就有可能多个CPU中缓存的数据时不一致的,这就导致了可见性问题。

1.2volatile实现的底层原理——volatile是如何解决可见性问题的

当一个变量被volatile修饰时,如果存在写操作,也就是说要改变数据的时候,在底层汇编代码中,会多一条lock指令。这条lock指令干了两件事。

一:首先它会立即的将缓存中的数据写回到内存中。而且在写回时,会独占共享内存——即阻止两个CPU同时去修改共享变量。这保证了内存中的数据一定是最新的。

二:然后这个写回操作会导致其他CPU中的缓存无效。不同的CPU采用了不同的策略来实现这一点。有的通过嗅探技术,有的采用了控制协议。总之,这保证了一旦内存中的数据被更新后,下次访问CPU中的缓存一定能得到内存中的新值。