volatile关键字及使用场景
一、原子性、可见性和有序性 Java内存模型主要是围绕着线程并发过程中如何处理原子性、可见性和顺序性这三个特征来设计的。 1、原子性 原子性表示任意时刻只有一个线程可以执行某一段功能代码,以防止多个线程同时访问某些共享数据时,造成错误。 2、可见性 可见性是指一个线程修改了某个共享变量后,其他线程能够立刻访问到被修改后的最新数据,也就是共享数据对其他线程都是可见的。 volatile修饰的变量在修改后会立即同步到主内存,在使用时会重新从主内存中读取。volatile变量是依赖主内存为中介来保证多线程下变量对其他线程的可见性。 synchronized关键字是通过在unlock之前必须把变量同步回主内存来实现可见性的。 final关键字则是因为变量在初始化后,值就不会更改,所以只要在初始化过程中没有把this指针传递出去也能保证对其他线程的可见性。 3、有序性 程序在运行时,指令的执行顺序并不是严格按照从上到下顺序执行的,可能会进行指令重排。根据CPU流水线作业,一般来说,简单的操作会先执行,复杂的操作后执行。 有序性从不同的角度来看是不同的。单纯从单线程来看都是有序的,但到了多线程就不一样了。可以这么理解,如果在一个线程内部观察,所有操作都是有序的。但是如果在一个线程内观察另一个线程,操作可能是无序的。也就是CPU进行的指令重排序对单线程程序而言,不会有什么问题,但是对于多线程程序