Singleton---单例模式(创建型)
来源:互联网 发布:弹幕播放器源码 编辑:程序博客网 时间:2024/06/05 11:21
Singleton
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
特点
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
代码示例
饿汉式—singleton
所谓饿汉式,就是在类加载时完成singleton实例的初始化,多线程安全。
在外部用例试图使用 getInstance 方法获取对象时,引起Singleton类的加载,引起静态成员变量 INSTANCE 的初始化。而且同一个类加载只会加 Singleton 一次。
public class Singleton { private Singleton(){} private static final Singleton INSTANCE = new Singleton();; public static Singleton getInstance() { return INSTANCE; } }
懒汉式—singleton
所谓懒汉式,就是在外部用例发出请求时,才会被动创建实例。
1 double check lock — 多线程几乎安全,在另一篇文章中介绍过 dcl 不一定是多线程安全的。
public class Singleton { private Singleton(){} private static Singleton instance; public static Singleton getInstance() { if(instance==null){ //step1 synchronized (Singleton.class) { if(instance==null){ //step2 instance = new Singleton(); } } } return instance; } }
step1 :如果没有 step1 处的判断,那么每个线程进入 getInstance 都要进行同步,这根直接将 getInstance 方法 设置为synchronized一样效率低下。
step2 :多线程情况下,可能会有多余一个线程在 synchronized 块前阻塞,若没有step2,可能会产生多个不同的实例。
2 内部类实现 — 多线程几乎安全,内部类实现结合了饿汉式思想。
public class Singleton { private Singleton() {} private static class InnerSingleton{ private static final Singleton INSTANCE = new Singleton(); } public static final Singleton getInstance() { return InnerSingleton.INSTANCE; } }
访问 InnerSingleton. INSTANCE 静态属性时同样会引起内部类InnerSingleton 的加载,加载过程中完成了静态变量 INSTANCE 的初始化。
0 0
- Singleton---单例模式(创建型)
- 创建型:单例模式(singleton)
- 创建型模式--单例模式(Singleton)
- 创建型模式-单例模式(singleton)
- 单例模式(Singleton)(对象创建型模式)
- 创建型模式之单例模式(Singleton)
- 创建型模式-----单例模式(Singleton)
- 创建型模式1:单例模式(Singleton Pattern)
- 【创建型模式一】单例模式(Singleton)
- 三、创建型模式:单例模式(SINGLETON)
- 创建型模式:单例模式(SINGLETON)
- 十二、单例模式Singleton(创建型模式)
- (创建型模式)SINGLETON——单例模式
- 设计模式-创建型-单例模式(Singleton)
- Singleton模式(单例模式 创建型)
- 设计模式--单例模式Singleton(创建型)
- 创建型模式:单例模式(Singleton)
- 创建型 - Singleton单例模式 (转)
- OpenGL ES 模板
- android Installation failed due to invalid URI! 错误处理
- Codeforces 5C
- IOS--UIImageView--帧动画
- 计蒜客 难题题库 013 整数转换成罗马数字
- Singleton---单例模式(创建型)
- C#写的FlappyBird
- uva 11361 Investigating Div-Sum Property 数位dp
- 编程之美----2.21 只考加法的面试题
- 项目实战JS之滚动条
- Codeforces 567F
- 黑马程序员-----java基础之运算符----与(&)、或(|)、非(!)、异或(^)、短路与(&&)等
- [POJ 3169] Layout 差分约束
- 计蒜客 难题题库 014 罗马数字转换成整数