volatile

本文探讨了双重检测锁机制的实现方式及其背后的原理。通过分析一个具体的代码示例,解释了为什么使用双重检测锁可以提高效率,同时避免多线程环境下创建多个实例的问题。此外,还深入讨论了Volatile关键字的作用机制,包括它如何确保内存可见性和禁止指令重排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双重检测


class Singleton{
    private volatile static Singleton instance = null;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

双重检测是为了提高效率,如果不同步可能产生多个对象,如果将整个函数同步了那么每次都要同步,其实读是不用同步的,这样写只有在第一需要同步,而在以前这样写也会不对,因为可能重排序是使instance先获得地址,而实例却还没写入地址。后来volatile不准重排序就解决了这个问题。

基本定义


对volatile变量的写会立即从线程的工作内存写入到主存中,并且会使其他线程工作内存(或者是高速缓存?)中的变量失效,迫使她重读。而普通变量不会这样。

volatile变量不是原子性的这种x++其实包含了好几个操作。
volatile使编译器不会重排。

而声明变量是volatile的,JVM保证了每次读变量都从内存中读,跳过CPU cache这一步。
今天又看到这么依旧 那么问题来了 volatile到底是使缓存失效,还是直接读的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值