volatile、synchronized关键字的区别

2020-06-09  本文已影响0人  __Witness

在我们日常开发中,volatile、synchronized两个关键字我们经常都会遇到。他们两个往往都会和线程相关,所以对于他们的区别自己一定要搞清楚。这里就记录一下它们的区别。

volatile

java中,我们使用volatile关键字修饰一个变量,则不保存拷贝,直接访问主内存。

在java的内存模型中,有主内存(main memory),每一个线程也有自己的memory内存空间(ThreadLocal、寄存器)。为了性能,一个线程会在自己的memory中保存一份要访问的变量的副本。这样就会出现同一个变量在某个瞬时,在一个线程的memory和另一个线程memory中,或者main memory中的值是不一致的情况。为了解决这样的问题,我们就可以为变量加上一个volatile关键字来修饰,这样这个变量就不会被cache在某个线程的memory中,线程对这个变量的访问个修改,都是直接对main memory就行操作。

synchronized

我们使用synchronized来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该代码逻辑。

volatile、synchronized区别

用法示例

使用volatile关键字的单例模式

private static volatile Singleton instance; // 使用volatile关键字
// 双重锁检验
public static Singleton getInstance() {
    if (instance == null) { // 第7行
        synchronized (Singleton.class) {
            if (instance == null) {
                instance = new Singleton(); // 第10行
            }
        }
    }
    return instance;
}
上一篇 下一篇

猜你喜欢

热点阅读