博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:单例模式(Singleton)
阅读量:5886 次
发布时间:2019-06-19

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

  单例模式在23个设计模式中算得上是最简单的一个了,也许你会有异议,那就换成“最简单之一”,这样就严谨了很多。

  单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
  适用性:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
这里写图片描述

单例模式有5中写法(线程安全):

1. 饿汉式
2. 懒汉式
3. 双检索(DCL)
4. 占位符式
5. 枚举式
下面分别展示这五种写法(详细内容可以参考博主的《》和《》)


饿汉式

public class EagerSingleton {          // jvm保证在任何线程访问uniqueInstance静态变量之前一定先创建了此实例          private static EagerSingleton uniqueInstance = new EagerSingleton();          // 私有的默认构造子,保证外界无法直接实例化          private EagerSingleton() {          }          // 提供全局访问点获取唯一的实例          public static EagerSingleton getInstance() {                  return uniqueInstance;          }  }

懒汉式

public class LazySingleton {          private static LazySingleton uniqueInstance;          private LazySingleton() {          }          public static synchronized LazySingleton getInstance() {                  if (uniqueInstance == null)                          uniqueInstance = new LazySingleton();                  return uniqueInstance;          }  }

双检锁

(博主不建议使用)

public class DoubleCheckedLockingSingleton {          // java中使用双重检查锁定机制,由于Java编译器和JIT的优化的原因系统无法保证我们期望的执行次序。          // 在java5.0修改了内存模型,使用volatile声明的变量可以强制屏蔽编译器和JIT的优化工作          private volatile static DoubleCheckedLockingSingleton uniqueInstance;          private DoubleCheckedLockingSingleton() {          }          public static DoubleCheckedLockingSingleton getInstance() {                  if (uniqueInstance == null) {                          synchronized (DoubleCheckedLockingSingleton.class) {                                  if (uniqueInstance == null) {                                          uniqueInstance = new DoubleCheckedLockingSingleton();                                  }                          }                  }                  return uniqueInstance;          }  }

占位符式

public class LazyInitHolderSingleton {          private LazyInitHolderSingleton() {          }          private static class SingletonHolder {                  private static final LazyInitHolderSingleton INSTANCE = new LazyInitHolderSingleton();          }          public static LazyInitHolderSingleton getInstance() {                  return SingletonHolder.INSTANCE;          }  }

枚举式

有关枚举的详细资料可以参考《》

public enum SingletonClass{    INSTANCE;}

Jdk中的单例模式:

java.lang.Runtime#getRuntime()


总结

枚举式式最简单最优秀的单例写法,可以防止反射工具(详细参考《》)和序列化破坏(详细参考《》),《Effective Java》的作者Joshua Bloch推荐使用这种写法,博主也认为这种写法不错,只是用的人较少,没有普遍性,建议编程时采用占位符式(不能防止反射和序列化破坏),当然写成枚举式就更好啦。

参考资料

1. 《》
2. 《》
3. 《》
4. 《》
5. 《Effective Java(Second Edition)》Joshua Bloch.
6. 《》

你可能感兴趣的文章
HTML5通信机制与html5地理信息定位(gps)
查看>>
汽车常识全面介绍 - 悬挂系统
查看>>
加快ALTER TABLE 操作速度
查看>>
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
PHP 程序员的技术成长规划
查看>>
memcached 分布式聚类算法
查看>>
jquery css3问卷答题卡翻页动画效果
查看>>
$digest already in progress 解决办法——续
查看>>
mysql 数据类型
查看>>
Ubuntu 设置当前用户sudo免密码
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
判断点是否在三角形内
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>