单子设计模式(Singleton pattern)
Posted 最初的愚者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单子设计模式(Singleton pattern)相关的知识,希望对你有一定的参考价值。
一.单子设计模式定义
单子设计模式也叫单例设计模式,就是采取一定的方法保证在整个软件系统中某个类只存在一个对象实例
二.单子设计模式的应用场景
1.资源共享情况下,防止资源操作时造成的性能损耗,如项目中用于读取配置文件的类等
2.控制资源的情况下,方便资源之间的相互通信,如线程池、数据库连接池等
3.特殊情况下,如网站统计同时在线人数,Windows中的任务管理器、回收站等
三.单子设计模式的需求
1.只有一个实例,在类的外部不能通过new(构造器)方法创建实例,因此隐藏构造器,即私有化构造器
2.自我实例化,类外部不能创建类实例,所以要在类内部创建实例
3.提供全局访问点,直接用类名访问该实例还是有被修改的风险,因此要把该实例隐藏起来,并提供静态get方法供外部访问
四.单子设计模式的实现方法
1.饿汉模式(立即加载)
不管以后会不会使用到该实例化对象,使用类的时候已经将对象创建完毕(立即加载),很着急,故又称为饿汉模式,常见的实现办法就是直接new实例化。
优点:实现简单,没有多线程同步问题
缺点:当类被加载的时候会初始化static的instance,静态变量被创建并分配内存空间,此后即使没用到该实例也会占据这段内存,当类被卸载时,静态变量被摧毁并释放占有的内存,因此某些特定条件下会耗费内存
2.懒汉模式(延迟加载)
等要用的时候才创建实例(延迟加载),不着急,故又称为懒汉模式,常见的实现方法就是在get方法中进行new实例化
优点:实现简单,当类被加载的时候,static的instance未被创建并分配内存空间,当get方法第一次被调用时,才初始化instance变量,并分配内存,因此在某些特定条件下会节约内存
缺点:多线程环境中这种实现方法是完全错误的,根本不能保证单例的状态
3.线程安全的懒汉模式
懒汉模式的基础上,在get方法前面加上synchronized关键字实现同步
优点:在多线程环境中,保证了“懒汉模式”的线程安全
缺点:多线程环境中,synchronized方法通常效率低
4.DCL双检查锁机制(Double Checked Locking)
将创建instance实例的代码放入同步代码块中,并在进入同步代码块前后都检查instance是否被实例化。第一次检查防止每次判空都要进入同步代码块,提高效率;第二次检查保证了在第一次检查的基础上确保单例状态
是单例模式的最佳实现方式,内存占用率高、效率高、线程安全、多线程操作原子性
以上是关于单子设计模式(Singleton pattern)的主要内容,如果未能解决你的问题,请参考以下文章
[Design Pattern] Singleton Pattern 简单案例