博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式的正确打开方式
阅读量:5041 次
发布时间:2019-06-12

本文共 1391 字,大约阅读时间需要 4 分钟。

单例模式

1. 饿汉式单例类

public class EagerSingleton {

    private static EagerSingleton instance = new EagerSingleton();

    /**

     * 私有默认构造子

     */

    private EagerSingleton(){}

    /**

     * 静态工厂方法

     */

    public static EagerSingleton getInstance(){

        return instance;

    }

}

 

  1. 懒汉式

public class LazySingleton {

    private static LazySingleton instance = null;

    /**

     * 私有默认构造子

     */

    private LazySingleton(){}

    /**

     * 静态工厂方法

     */

    public static synchronized LazySingleton getInstance(){

        if(instance == null){

            instance = new LazySingleton();

        }

        return instance;

    }

}

 

  1. 线程安全单例

public class Singleton {

    private volatile static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){

        //先检查实例是否存在,如果不存在才进入下面的同步块

        if(instance == null){

            //同步块,线程安全的创建实例

            synchronized (Singleton.class) {

                //再次检查实例是否存在,如果不存在才真正的创建实例

                if(instance == null){

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

 

  1. 同时实现延迟加载和线程安全的单例模式

public class Singleton {

    

    private Singleton(){}

    /**

     *    类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例

     *    没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。

     */

    private static class SingletonHolder{

        /**

         * 静态初始化器,由JVM来保证线程安全

         */

        private static Singleton instance = new Singleton();

    }

    

    public static Singleton getInstance(){

        return SingletonHolder.instance;

    }

}

 

  1. 最佳方法

public enum Singleton {

    /**

     * 定义一个枚举的元素,它就代表了Singleton的一个实例。

     */

    uniqueInstance;

    /**

     * 单例可以有自己的操作

     */

    public void singletonOperation(){

        //功能处理

    }

}

 

转载于:https://www.cnblogs.com/scaulgj/p/7553938.html

你可能感兴趣的文章
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
阿里市值超越亚马逊 马云开启下半场技术理想
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>
oracle导出/导入 expdp/impdp
查看>>
类指针
查看>>
css修改滚动条样式
查看>>
2018.11.15 Nginx服务器的使用
查看>>