弄懂volatile之前首先确保弄懂了java内存模型,可参考我的整理
    Java内存模型

    volatile的作用如下:

    1. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
    2. 禁止进行指令重排序。(涉及volatile变量的代码的前面和后面的代码不会进行重排序)。

    注意:

    1. volatile不保证被修饰的变量的操作的原子性(要保证操作的原子性建议使用同步:synchronized和Lock)。

    使用场景:

    • 标记状态量:
    1. volatile boolean flag = false;
    2. while(!flag){
    3. doSomething();
    4. }
    5. public void setFlag() {
    6. flag = true;
    7. }
    1. //保证了线程1的语句一一定在语句二之前执行(因为volatile禁止重排序),
    2. // 否则可能会线程1的语句二先执行,这时线程2的while循环跳出,
    3. // 立刻执行doSomethingWithConfig(context);
    4. // 此时context还没赋值,出现空指针异常。
    5. volatile boolean inited = false;
    6. //线程1:
    7. context = loadContext(); //语句一
    8. inited = true; //语句二
    9. //线程2:
    10. while(!inited ){
    11. sleep()
    12. }
    13. doSomethingWithConfig(context);
    • double check:
    1. class Singleton{
    2. private volatile static Singleton instance = null;
    3. private Singleton() {
    4. }
    5. public static Singleton getInstance() {
    6. if(instance==null) {
    7. synchronized (Singleton.class) {
    8. if(instance==null)
    9. instance = new Singleton();
    10. }
    11. }
    12. return instance;
    13. }
    14. }

    参考:Java并发编程:volatile关键字解析