单例模式的使用
2018-01-03 14:25
211 查看
单例模式适用于重新构造消耗大,又时常需要用到的类,一般又懒汉模式、饿汉模式、DCL模式和静态内部类模式这几种
懒汉模式在每次获得单例的时候都使用synchronized(加内部锁方式的同步)关键字进行同步,消耗较大
饿汉模式没有同步的问题,每次获取到的都是同一单例,但不管有没有用到都会创建对象,浪费空间
DCL方法有上面两种单例方法的优点,既保证了使用时才进行初始化,又保证了线程安全,但在某些情况下会有小概率出错,尽管如此,这仍然是用得最广泛的单例方法
既保证了线程安全,也达到了节省资源的目的,是推荐使用的单例模式
枚举模式是实现单例最简单的模式,因为枚举本身就具有线程安全性,所以我们无需担心线程安全的问题,而且枚举安全也避免了序列化时重新生成对象的问题(当然,这个问题我们一般碰不到)
懒汉模式
public class Example { private static Example example; private Example(){ } public static synchronized Example getInstance() { if (example == null) { example = new Example(); } return example; } }
懒汉模式在每次获得单例的时候都使用synchronized(加内部锁方式的同步)关键字进行同步,消耗较大
饿汉模式
public class Example { private static final Example example = new Example(); private Example(){ } public static Example getInstance() { return example; } }
饿汉模式没有同步的问题,每次获取到的都是同一单例,但不管有没有用到都会创建对象,浪费空间
DCL模式
public class Example { private static volatile Example example = null; private Example(){ } public static Example getInstance() { if (example == null) { synchronized (Example.class) { if (example == null) { example = new Example(); } } } return example; } }
DCL方法有上面两种单例方法的优点,既保证了使用时才进行初始化,又保证了线程安全,但在某些情况下会有小概率出错,尽管如此,这仍然是用得最广泛的单例方法
静态内部类模式
public class Example { private Example(){ } public static Example getInstance() { return ExampleHolder.example; } private static class ExampleHolder { private static final Example example = new Example(); } }
既保证了线程安全,也达到了节省资源的目的,是推荐使用的单例模式
枚举模式
public enum Example { INSTANCE; public void doSomething(){ ... } }
枚举模式是实现单例最简单的模式,因为枚举本身就具有线程安全性,所以我们无需担心线程安全的问题,而且枚举安全也避免了序列化时重新生成对象的问题(当然,这个问题我们一般碰不到)
总结,单例模式分成了上面几种,一般推荐使用静态内部类实现单例,DCL模式虽然是应用最为广泛的模式,但因为java的内存模型还存在着小概率的问题,而Google官方不推荐使用枚举模式
相关文章推荐
- SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+动态修改注解Log)
- Entity Framework应用:使用Code First模式管理数据库创建和填充种子数据
- Xcode 项目中我们可以使用 ARC 和非 ARC 的混合模式。
- RabbitMQ入门及常用的5种模式的简单使用(二)
- F#中的异步及并行模式(3 - 下):代理的进一步使用
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
- JavaServer Faces框架使用的设计模式
- OpenCV 2 学习笔记(13): 算法的基本设计模式<4> :使用Model-View-Controller模式创建一个应用程序
- C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)
- 阻塞模式下使用IOCP
- 使用ALTER PLUGGABLE DATABASE语句修改PDB的打开模式,必须满足的先决条件
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- win10系统怎么切换平板模式?win10平板模式的使用方法
- 单例模式使用 Quartz.Net执行定时任务
- 禁止IE8使用IE7的兼容模式
- svn 命令模式使用记录
- 在SL中使用全屏模式 (zz)
- 是时候开始使用JavaScript严格模式了
- win7使用伪分布模式配置Hadoop2.2