Java单例创建方式有哪些

发布时间:2022-02-14 10:52:12 作者:iii
来源:亿速云 阅读:163

本文小编为大家详细介绍“Java单例创建方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java单例创建方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

定义

单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

使用场景

单例模式八种方式

饿汉式(静态常量)

代码

/**
 * 饿汉式(静态常量)
 * 优势:简单,避免多线程的同步问题
 * 劣势:无懒加载,内存浪费
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton1 {
    // 私有化构造方法
    private Singleton1(){}

    // 静态常量
    private static final Singleton1 singleton1 = new Singleton1();

    // 对外提供公共方法
    public static Singleton1 getSingleton1(){
        return singleton1;
    }
}

分析

饿汉式(静态代码块)

代码

/**
 * 饿汉式(静态代码块)
 * 优势:简单,避免多线程的同步问题
 * 劣势:无懒加载,内存浪费
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton2 {
    // 私有化构造方法
    private Singleton2(){}

    private static final Singleton2 singleton2;

    // 静态代码块
    static {
        singleton2 = new Singleton2();
    }

    // 对外提供公共方法
    public static Singleton2 getSingleton2(){
        return singleton2;
    }
}

分析

懒汉式(线程不安全)

代码

/**
 * 懒汉式(线程不安全)
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton3 {
    // 私有化构造方法
    private Singleton3(){}

    // 内部属性
    private static Singleton3 singleton3;

    // 对外提供公共方法
    public static Singleton3 getSingletons(){
        if(singleton3 == null){
            singleton3 = new Singleton3();
        }
        return singleton3;
    }
}

分析

懒汉式(同步方法)

代码

/**
 * 懒汉式(同步方法)
 * 优势:解决了线程同步问题
 * 劣势:使用synchronized同步关键字,性能太低
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton4 {
    // 私有化构造方法
    private Singleton4(){}

    // 内部属性
    private static Singleton4 singleton4;

    // 对外提供公共方法
    public static synchronized Singleton4 getSingleton4(){
        if(singleton4 == null){
            singleton4 = new Singleton4();
        }
        return singleton4;
    }
}

分析

懒汉式(同步代码块)

代码

/**
 * 懒汉式(同步代码块)
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton5 {
    // 私有化构造方法
    private Singleton5(){}

    // 内部属性
    private static Singleton5 singleton5;

    // 对外提供公共方法
    public static Singleton5 getSingleton5(){
        if (singleton5 == null){
            synchronized (Singleton5.class){
                singleton5 = new Singleton5();
            }
        }
        return singleton5;
    }
}

分析

双重检查锁方式

代码

/**
 * 双重检查锁机制
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton6 {
    // 私有化构造方法
    private Singleton6(){}

    // 内部属性
    private volatile static Singleton6 singleton6;

    // 对外提供公共方法
    public static Singleton6 getSingleton6(){
        if (singleton6 == null){
            synchronized (Singleton6.class){
                if(singleton6 == null){
                    singleton6 = new Singleton6();
                }
            }
        }
        return singleton6;
    }
}

分析

静态内部类方式

代码

/**
 * 静态内部类
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
public class Singleton7 {
    // 私有化构造方法
    private Singleton7(){}

    // 内部类
    private static class SingleInstance{
        public static final Singleton7 singleton7 = new Singleton7();
    }

    // 对外提供公共方法
    public static Singleton7 getSingleton7(){
        return SingleInstance.singleton7;
    }
}

分析

枚举方式

代码

定义单例对象

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/11 10:25
 * @version:1.0
 */
public class Singleton {

    public void hello(){
        System.out.println("hello");
    }
}

定义枚举实例化单例对象

/**
 * 枚举方式
 * @author:liyajie
 * @createTime:2022/2/10 15:50
 * @version:1.0
 */
enum Singleton8 {
    // 相当于public static final Singleton8 INSTANCE;
    // 保证了枚举实例只能被实例化一次
    INSTANCE;

    // 定义单例变量
    private Singleton singleton;

    // 枚举构造方法,该构造方法是private,执行构造方法的时候,同时创建我们的单例对象
    Singleton8() {
        singleton = new Singleton();
    }

    // 对外提供公共方法
    public Singleton getSingleton() {
        return singleton;
    }
}

使用方法Singleton8.INSTANCE.getSingleton()即可获取我们的单例对象了

分析

读到这里,这篇“Java单例创建方式有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 单例的实现方式
  2. 单例 (补充) 创建单例的三种方式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:怎么在电脑上禁用netbios

下一篇:电脑浏览器出现花屏怎么办

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》