单例的几种实现方式

共 5317字,需浏览 11分钟

 ·

2021-04-17 19:14

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

使用单例需要注意的关键点

1、将构造函数访问修饰符设置为private

2、通过一个静态方法或者枚举返回单例类对象

3、确保单例类的对象有且只有一个,特别是在多线程环境下

4、确保单例类对象在反序列化时不会重新构建对象

单例模式的几种写法

1.饿汉式(静态常量)

class Singleton{
    //1.构造器私有化,外部不能new
    private Singleton(){

    }

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

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

2、饿汉式(静态代码块)

class Singleton {
    //1.构造器私有化,外部不能new
    private Singleton() {

    }

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

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

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

3、懒汉式(线程不安全)

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

4、懒汉式(线程安全,同步方法)

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    //提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

5、懒汉式(双重校验,线程安全,效率较高,推荐使用)

class Singleton {
    private static volatile Singleton instance;   //volatile保证线程间的可见性

    private Singleton() {
    }

    //提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题
    //同时保证了效率,推荐使用
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

6、静态内部类完成,推荐使用

class Singleton {
    private Singleton() {
    }

    //写一个静态内部类,该类中有一个静态属性Singleton
    //在调用getInstance()方法时,静态内部类才会被装载,保证了懒加载;同时类加载是线程安全的
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    //提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

7、使用枚举,推荐使用

enum Singleton{
    INSTANCE; //属性
    public void doSomething(){
        System.out.println("do something");
    }
}


————————————————

版权声明:本文为CSDN博主「繁臣」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_35028940/article/details/115510972




粉丝福利:Java从入门到入土学习路线图

👇👇👇

👆长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报