🌊【Code皮皮虾】:请分别写出线程安全和不安全的单例模式!!!

266 阅读2分钟

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

本文同时参与 「掘力星计划」  ,赢取创作大礼包,挑战创作激励金

Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm...,日子还很长,让我们一起加油努力叭🌈


🔥前言——>精选专栏

毛遂自荐,给大家推荐一下自己的专栏😁,欢迎小伙伴们收藏关注😊

力扣算法题解专区

小白学Java

MybatisPlus专栏

App爬虫专栏

PC端爬虫专栏

大厂面试题专栏



❔什么是单例模式?

引用菜鸟教程的介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。




线程不安全



懒汉式

public class Singleton {

    private volatile static Singleton singleton;

    private Singleton() {

    }

    public static Singleton getSingleton() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}

image.png



线程安全



饿汉式

public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton() {
    }

    public static Singleton getSingleton() {
        return singleton;
    }


}


双重检查

public class Singleton {

    private volatile static Singleton singleton;

    private Singleton() {

    }

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

在这里插入图片描述



静态内部类

public class Singleton {


    private Singleton() {

    }

    public static class SingletonHolder {
        private static final Singleton singleton = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.singleton;
    }
}

在这里插入图片描述



枚举

public enum  Singleton {
    INSTANCE;

    Singleton() {
    }

}

在这里插入图片描述

创建枚举默认就是线程安全的,并且还能防止反序列化导致重新创建新的对象。


完善使用enum枚举实现单例模式

public class SingletonFactory {

    private enum Singleton {
        singleProtect;

        private product instance;

        private Singleton() {
            instance = new product();
        }

        public product getInstance() {
            return instance;
        }

    }

    public static product getInstance() {
        return Singleton.singleProtect.getInstance();
    }
}

//需要实现单例的类
class product {
    public product(){}
}

在这里插入图片描述




懒汉式(加锁)

public class Singleton {

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

}

在这里插入图片描述


❤最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~


一键三连.png