单例设计模式补充-volatile 关键字

本文深入探讨了单例模式的实现方式,并通过具体案例解释了volatile关键字如何解决多线程环境下变量可见性和重排序问题。

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

之前写过单例模式23种设计模式之单例模式

volatile关键字

  • 防止重排序
    如图:多线程的时候,可能会导致开辟内存之后直接将给变量复制了,导致重排序

image.png

  • 线程可见性 - 某一个线程改了公用对象(变量),短时间内另一个线程可能是不可见的,因为每一个线程都有自己的缓存区(线程工作区)
    如案例
  public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();
        while(true){
            if(td.isFlag()){
                System.out.println("------------------");
                break;
            }
        }

        // 执行结果? flag= true  ------------------
    }
}
class ThreadDemo implements Runnable {
    private  boolean flag = false;
    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
        }
        flag = true;
        System.out.println("flag=" + isFlag());
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

执行后只显示true而不打印——————,原因就是,多线程导致另一个线程是不可见导致 flag一直等于 false;加一个volite即可

单例设计模式之容器管理 系统的服务就是用的这种

public class Singleton {
    private static HashMap<String,Object> mMap=new HashMap<>();
    static {
        mMap.put("Singleton", new Singleton());
    }
    private Singleton(){

    }
    public static Object get(String key){
        return mMap.get(key);
    }
}

单例模式之自己做一个

public class Singleton2 {
    private static Singleton2 mInstance;
    static {
        mInstance=new Singleton2();
    }
    private Singleton2(){

    }
    public static Singleton2 getInstance(){
        return mInstance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值