volatile关键字有什么用| Java Debug 笔记

315 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:volatile关键字有什么用

在工作的时候,我碰到了volatile关键字。但是我不是非常了解它。我发现了这个解释

这篇文章已经解释了问题中的关键字的细节了,你们曾经用过它吗或者见过正确使用这个关键字的样例

回答

  1. Java中同步的实现大多是通过关键字synchronized和volatile和锁

  2. 在Java里面,我们没有 synchronized 的变量。对一个变量使用 synchronized 关键字是非法的,会导致编译错误的。我们可以使用volatile变量而不是synchronized变量,volatile变量会让JVM里面的线程去主存中读取volatile 变量的值并且不在本地副本里面缓存

  3. 如果一个变量没有被多个线程共享,那就不需要使用volatile关键字了。

volatile使用的例子:

public class Singleton {
    private static volatile Singleton _instance; // volatile variable
    public static Singleton getInstance() {
        if (_instance == null) {
            synchronized (Singleton.class) {
                if (_instance == null)
                    _instance = new Singleton();
            }
        }
        return _instance;
    }
}

我们在第一次使用的时候才创建这个实例

如果我们没有给这个变量加volatile,那么创建单例的那个线程就没办法和其他线程通信。如果线程A在创建一个单例,在创建完单例以后,cpu炸了,那么其他线程就看不到这个实例了,它们就觉得这个实例还是空的。

为什么会发生这种情况?因为读线程没有加锁,直到写线程来到了同步代码块,内存没有被同步,实例的值还未被刷新到主存里。在 Volatile关键字以后,这就由Java自身处理,这样的更新是对所有的读线程可见的

Conclusion: volatile 关键字也可以用于多个线程在主存的通信

不使用volatile的例子:

public class Singleton{    
    private static Singleton _instance;   //without volatile variable
    public static Singleton getInstance(){   
          if(_instance == null){  
              synchronized(Singleton.class){  
               if(_instance == null) _instance = new Singleton(); 
      } 
     }   
    return _instance;  
    }

文章翻译自Stack Overflow:stackoverflow.com/questions/1…