面经-并发-volatitle
volatitle能否保证线程安全?
线程安全要考虑三个方面:可见性,有序性,原子性。
1.可见性:一个线程对共享变量修改,另一个线程能看到最新结果。
2.有序性:一个线程内代码按照编写顺序执行。
3.原子性:一个线程内多行代码以一个整体运行,期间不能有其他线程代码插队。
volatile能够保证共享变量的可见性和有序性,不能保证原子性。
原子性:
一个线程执行时,可能进行了变量操作,但并未保存,此时另一个线程插队又对此变量进行操作,导致最后变量结果出问题。
可见性:
当CPU多次从内存中拿到同一个值时,JIT对代码进行优化:直接将拿到值后的代码缓存,提高性能。此时线程2再对内存中的变量进行操作,原先的线程就陷入死循环。而后续的线程3则可读到改变后的代码。
解决办法:使用volatile。JIT发现变量使用volatile修饰,则不对这个变量进行优化。
有序性:
指令重排序。可以通过volatile禁止。
原理: