单例模式
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、静态内部类
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章