单例模式

1、单例设计模式的简介#

采取一定的方法保证在整个软件系统中,某个类只存在一个对象实例

比如Hibernate的SessionFactory,他作为数据存储源的代理,负责创建Session对象,但是SessionFactory并不是轻量级的

,一般情况下,一个项目只需要一个SessionFactory就足够了,这就会使用到单例模式

 

2 单例设计模式的八种实现方式#

clipboard

 #

3 饿汉式(静态常量)#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 15:44
 * @Description:    单例模式的饿汉式写法
 */
public class SingletonTest01 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);
    }
}


class Singleton{

    //1、私有化构造器,这样外部就不能通过构造器来创建对象
    private Singleton(){

    }

    //2、本类内部创建对象实例
    private final static Singleton instance = new Singleton();

    //3、对外提供一个共有的静态方法,返回对象实例
    public static Singleton getInstance(){
        return instance;
    }

}
复制代码

 

4 饿汉式(静态代码块)#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 15:44
 * @Description:    单例模式的饿汉式写法(静态代码块)
 */
public class SingletonTest02{
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);
    }
}

class Singleton{

    //1、私有化构造器,这样外部就不能通过构造器来创建对象
    private Singleton(){

    }

    //2、本类内部创建对象实例
    private static Singleton instance;

    //3、在静态代码块中创建单例对象
    static {
        instance = new Singleton();
    }

    //4、对外提供一个共有的静态方法,返回对象实例
    public static Singleton getInstance(){
        return instance;
    }

}
复制代码

 

5 懒汉式(线程不安全)#

复制代码
public class SingletonTest03 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

class Singleton{

    private static Singleton instance;

    private Singleton(){};

    //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
    public static Singleton getInstance(){
     // 多个线程进来时,会创建多个 Singleton实例,这就违反了单例模式的设计原则
if(instance==null){ instance = new Singleton(); } return instance; } }
复制代码

 

clipboard

优缺点:

clipboard

6 懒汉式(使用同步方法解决线程安全问题)#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 16:14
 * @Description:  懒汉式  同步方法解决线程安全问题
 */
public class SingletonTest04 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

class Singleton{

    private static Singleton instance;

    private Singleton(){};

    //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
}
复制代码

 

7 懒汉式(使用同步代码块)#

复制代码
public class SingletonTest04 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

class Singleton{

    private static Singleton instance;

    private Singleton(){};

    //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                instance = new Singleton();
            }
        }
        return instance;
    }
}
复制代码

 

 

8 双重检查#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 16:25
 * @Description:     双重检查实现单例模式
 */
public class SingletonTest06 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

class Singleton{

    // volatile: 轻量级的synchronized, 由它修饰的变量在发生变化后会立即刷新到主存
    private static volatile Singleton instance;

    private Singleton(){};


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

 

 

9 静态内部类#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 16:59
 * @Description:  静态内部类实现单例模式
 */
public class SingletonTest07 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

class Singleton{
    private Singleton(){

    }

    //写一个静态内部类,该类中有一个静态属性instance
    private static class SingletonInstance{
        private static final Singleton instance= new Singleton();
    }

    //提供一个静态的共有方法
    public static Singleton getInstance(){
        return  SingletonInstance.instance;
    }
}
复制代码

 

 #

10 枚举实现单例模式#

复制代码
/**
 * @author houChen
 * @date 2020/9/19 17:06
 * @Description:  枚举实现单例模式
 */
public class SingletonTest08 {
    public static void main(String[] args) {

        Singleton instance = Singleton.INSTANCE;
        Singleton instance1 = Singleton.INSTANCE;
        System.out.println(instance==instance1);

        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

//使用枚举 可以实现单例
enum Singleton{
    INSTANCE;

    public void sayOk(){
        System.out.println("say ok~");
    }
}
复制代码

 

posted @   青岑  阅读(188)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
主题色彩