1.volatile特性
1、具备可见性
2、不保证有原子性
具备可见性:
在java多线程并发中,各个线程具有自己独立的工作内存,拷贝主内存中同一份数据,可见性表明,当某一个线程对主内存(共享数据)有所修改的话,其余各个线程也可知晓变化,同时改变各自工作内存中的数据的值。
具体实现:分线程中的数据改变后,会改变主内存中的该数据的值,同时通知其他线程数值的改变,以达到可见性的目的。
声明方法
public static void main(String[] args){
volatile int number = 10;
}
不保证原子性:
原子性:原子即不可再分的最小粒子,简而言之,具有原子性意味着一组代码块需要同步完成,即如果该组代码块某条语句执行失败,则整个代码块中的所有语句均会失效。
如何解决该问题:
1:
添加synchronized
2:
使用juc下的AtomicInteger
2.指令重排与volatile
1、计算机在执行程序时,会进行指令重排以提高程序只能够行效率。
简单来说,就是我们平常程序中执行的语句的顺序在翻译成指令后的执行顺序并不一定与原来的长须执行顺序相同,这样可以使无关的指令操作并发执行,提高并发的效率。但是这样有可能导致程序逻辑错误的问题,使得结果无法预测。
volatile实现禁止指令重排优化,从而避免多线程下程序出现错乱的执行顺序的现象。