单例模式

Posted qi1007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

概念:

单例模式(Singleton),也叫单子模式,是一种常用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候,整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,显然,这种方式简化了在复杂环境下的配置管理。

实现方式:

1.是在调用方法的时候进行实例化的工作,这种方式俗称懒汉模式;

2.是在类的加载的时候就创建一个实例,这种方式俗称饿汉模式;

实现单例模式:

1、懒汉式,线程不安全:

public class Boss {
    private Boss() {
    }
    private static Boss boss = null;
    public static Boss getBoss(){
        if(boss == null) {
            boss = new Boss();
        }
        return boss;
    }
}

 

public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        for (int i = 0; i < 20; i++) {
            pool.execute(new Thread(){
                @Override
                public void run() {
                    Boss boss = Boss.getBoss();
                    System.out.println(boss);
                }
            });
        }
    }

运行结果:

技术分享图片

描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

2、懒汉式,线程安全

public class Boss {
    private Boss() {
    }
    private static Boss boss = null;
    public static synchronized Boss getBoss(){
        if(boss == null) {
            boss = new Boss();
        }
        return boss;
    }
}

运行结果:

技术分享图片

 

描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。

3、双重校验锁

public class Boss {
    private Boss() {
    }
    private static Boss boss = null;
    public static synchronized Boss getBoss(){
        if(boss == null) {
            synchronized (Boss.class){
                if(boss == null) {
                    boss = new Boss();
                }
            }
        }
        return boss;
    }
}

运行结果:

技术分享图片

描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

优点:安全且保持高效性。

4、静态内部类

 




以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块