voliate

 voliate定义

java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。

即一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

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

使用volatile关键字的场景

一般使用voliate必须具备如下条件:

(1)对变量的写操作不依赖于当前值

(2)变量中没有包含影响外部的其他变量

第一种就是适合单例模式来修饰单例对象

public class Signle {
    private static volatile Signle SIGNLE;

    private Signle() {
    }

    public static Signle getInstance0() {
        return SingleLazy.SIGNLE;
    }

    public static Signle getInstance() {
        if (null == SIGNLE) {
            synchronized (Signle.class) {
                if (null == SIGNLE) {
                    SIGNLE = new Signle();
                }
            }
        }
        return SIGNLE;
    }
第二种情况就是该变量是全局的属性,如果变化,会导致全局所有的线程都作出相应的操作。