欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【设计模式】单例模式

程序员文章站 2022-07-10 19:15:04
定义 确保某个类只有一个实例 实现方式 饿汉式加载(线程安全) 等价于 懒汉式加载 非线程安全 线程安全 1. Double Check 2. 借助Lazy "示例代码 github" ......

设计模式之单例模式的学习。

单例模式的定义:属于创建型模式,重点在单字,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

饿汉式(线程安全)

public class Singleton {
    private static Singleton instance = new Singleton();

    public Singleton() {
    }

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

饿汉式,可以这样理解,由于饿,所以一开始就要有东西提供,所以在类加载时候就创建实例。
由于是在类加载时候创建实例,不会产生线程不安全

懒汉式(线程不安全)

public class Singleton {
    private static Singleton instance;

    public Singleton() {
    }

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

懒汉式,比较懒,不需要我就不创建,需要的时候我才创建。
多线程中,线程是不安全的,因为可能多个线程进入if,即创建多个不同的对象。

懒汉式(加锁线程安全)

public class Singleton {
    private static Singleton instance;

    public Singleton() {
    }

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

由于多个线程共享instance,所以干脆加把锁,这样的话,效率是肯定会有一定降低的。

懒汉式(双重校验锁)

public class Singleton {
    private static volatile Singleton instance;

    public Singleton() {
    }

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

由上面我们发现,只有第一次创建时候可能存在线程安全问题,没必要整个加上锁。
所以采用双重校验锁,使用volatile关键词保证可见性。

本文地址:https://blog.csdn.net/Miiiiiiiiiii/article/details/112252167