3.单例模式------双检测锁机制的单例模式

本文探讨了在多线程环境中,如何通过双检测锁(Double-checked locking)机制实现单例模式,以确保在并发情况下仍然只有一个实例。对比了不同同步策略的优缺点,强调了双检测锁机制在效率和单例原则之间的平衡。
摘要由CSDN通过智能技术生成

前面介绍的懒汉式单例模式使用方法,在单线程的程序应用中是没有任何问题的,但是在多线程的程序中就会出现问题,当多个线程都进行if(instance == null)判断时,就会产生多个类的实例,这就违反了单例模式的原则,也不符合程序的需要,怎么办呢?对于多线程下的应用,可以增加synchronized()同步机制,示意代码如下:

public class Singleton{
    private static Singleton instance = null;
    pricate Singleton(){
        //.....
    }
    //增加同步机制
    public static synchronized Singleton getInstance(){
        if (instance == null){
            instance == new Singleton();
        }
        return instance;
    }
}

此时,将synchronized(同步)机制放在了获取实例的方法上,如果该程序在多个线程下执行,将会只产生一个该类的实例,达到了单例模式的需求,但是因为这种写法是将synchronized(同步)机制放在了获取实例的方法上,导致程序每获取一次实例,都将进入synchronized(同步)机制,如果在程序运行时,需要大量的获取该类的实例,这种方法将时非常低效的。还有另外一种写法,将synchronized(同步)机制放在产生实例的代码前。示意代码如下所示:

public class Singleton{
    private static Singleton instance = null;
    private Singleton(){
        //...
    }
    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){//增加同步机制
                instance = new Singleton();
            }
        }
    }
}

这种写法避免了每次获取实例时,都进入sunchronized(同步机制),但是和最初的写法一样,采用这种写法则避免不了在多线程时,返回多个实例的问题,为此产生了新的写法Double-checked locking(双检测锁)机制,示意代码如下:

    public class Singleton{
        private static Singleton instance = null;
        private Singleton(){
            //..
        }
        Public static Singleton getInance(){
            if (instance == null){
                Synchronized(Singleton.Class)//增加同步机制
                if (instance == null){//对是否为null再次进行判断
                    instance = new Singleton();
                }
            }   
            return instance;
        }
    }

这种方式下,只有第一次创建实例时,才进入synchronized(同步)机制,以后因为实例已经创建,将不会再进入synchronized同步机制。因此这种做法,满足了在多线程条件下单例模式的应用,其实最简单的做法,还是最开始的那种,直接new一个该类的实例,示意代码如下:

public class Singleton{
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值