单例模式(饿汉模型,懒汉模型)

在着里我们先了解什么是单例模式。

就是某个类在进程中只能有单个实例,这里的单例模式需要一定的编程技巧,做出限制,一旦程序写的有问题,创建了多个实例,编程就会报错。

如果我们学会了单例模式,这种模式会提高我们的下限。

其中单例模式包含了两种模型,一种是饿汉模型,另一种是懒汉模型,这里的懒汉模型尤为重要,面试也会考。


饿汉模型


这里的单列就是指一个对象,instance。

如代码:

复制代码
class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){
        return instance;
    }
}

这里我们采用 static 来修饰 instance ,因为当初始化的时候只执行一次。

还有当我们想要获取 instance 变量的时候,直接调用getInstance方法就行了,这样我们不用重新在new了。

上述的代码,是饿汉模型。


懒汉模型


这里的懒汉模型不是在程序创建的时候new,而是第一次使用的时候才去创建,这样就可以节省当不用时,我们不用创建的开销。

如代码:

复制代码
class SingletonLazy {
    private static SingletonLazy instance = null;

    public SingletonLazy getinstance(){
                if(instance == null){
                    instance = new SingletonLazy();
                }
        return instance;
    }
    
}

如上述代码,我们可以看到,就是调用的时候就用。

那么,如果这样是否会引起线程安全问题呢?

答案会引起线程安全问题。

在这里我们当有两个线程同时运行的时候,其线程1和线程2,同时进入if判定,都为true,此时我们就会出现两个,new了,直接就报错了。

那么这里我们加上锁之后,会不会线程安全了呢?

如代码:

复制代码
class SingletonLazy {
    private static SingletonLazy instance = null;

    public static Object locker = new Object();

    public SingletonLazy getinstance(){
        if(instance == null){
            synchronized (locker){
                    instance = new SingletonLazy();
            }
        }
        return instance;
    }

}

这里加上锁也是不安全的,我们具体分析一下。还是两个线程,当出现这种执行顺序时,

如图:

由图中我们可以知道,这种加锁,仍会 new两个。

在这里我们可以采用双重 if 来解决这种线程安全问题。

如代码:

复制代码
class SingletonLazy {
    private static SingletonLazy instance = null;

    public static Object locker = new Object();

    public SingletonLazy getinstance(){
        if(instance == null){
            synchronized (locker){
                if(instance == null){
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

}

如代码,我们在锁里面再加个 if 就可以避免 两个new了,使线程安全。

相关推荐
清水白石00819 小时前
《用 Python 单例模式打造稳定高效的数据库连接管理器》
数据库·python·单例模式
加油=^_^=20 小时前
【C++11】特殊类设计 | 类型转换
c++·单例模式·类型转换
syt_10131 天前
设计模式之-单例模式
单例模式·设计模式
有一个好名字2 天前
设计模式-单例模式
java·单例模式·设计模式
SmoothSailingT2 天前
C#——Lazy<T>懒加载机制
开发语言·单例模式·c#·懒加载
程序员卷卷狗3 天前
Java 单例模式的五种实现:饿汉式、懒汉式、DCL、静态内部类、枚举单例
java·开发语言·单例模式
SmoothSailingT3 天前
C#——单例模式
开发语言·单例模式·c#
博语小屋4 天前
简单线程池实现(单例模式)
linux·开发语言·c++·单例模式
利刃大大4 天前
【JavaSE】十五、线程同步wait | notify && 单例模式 && 阻塞队列 && 线程池 && 定时器
java·单例模式·线程池·定时器·阻塞队列
筏.k4 天前
C++ 设计模式系列:单例模式
c++·单例模式·设计模式