浅谈单例模式
来源:互联网 发布:宝马编程是什么意思 编辑:程序博客网 时间:2024/06/05 06:15
首先,我们先来说一下什么是设计模式。设计模式是一套反复使用多人知晓的,经过分类编目的,代码设计经验的总结。而单例模式是设计模式的一种。
下面是这23种设计模式,我们主要讲一下单例模式。
创建型
Factory Method(工厂方法)
Abstract Factory(抽象工厂)
Builder(建造者)
Prototype(原型)
Singleton(单例)
结构型
Adapter Class/Object(适配器)
Bridge(桥接)
Composite(组合)
Decorator(装饰)
Facade(外观)
Flyweight(享元)
Proxy(代理)
行为型
Interpreter(解释器)
Template Method(模板方法)
Chain of Responsibility(责任链)
Command(命令)
Iterator(迭代器)
Mediator(中介者)
Memento(备忘录)
Observer(观察者)
State(状态)
Strategy(策略)
Visitor(访问者)
好了,回归正题,我们主要来讲单例模式,大神代码学习中:http://cantellow.iteye.com/blog/838473。
单例模式的七种例子:
懒汉模式,但是线程不安全
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}
懒汉模式,但是线程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}
“单纯的”饿汉模式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; }}
“变异的”饿汉模式
public class Singleton { private Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return this.instance; }}
静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; }}
我最爱的“枚举”
public enum Singleton { INSTANCE; public void whateverMethod() { }}
双重校验锁
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }}
饿汉式和懒汉式区别
从名字上来说,饿汉和懒汉,
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
另外从以下两点再区分以下这两种方式:
1、线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。
2、资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
至于1、2、3这三种实现又有些区别,
第1种,在方法调用上加了同步,虽然线程安全了,但是每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的,
第2种,在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
第3种,利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。
- 浅谈单例模式
- 浅谈单例模式
- 单例模式浅谈
- 浅谈单例模式
- 浅谈单例模式
- 单例模式浅谈
- 浅谈单例模式
- 浅谈-单例模式
- 浅谈单例模式
- 浅谈单例模式
- 浅谈单例模式
- 单例模式浅谈
- 浅谈单例模式
- 单例模式浅谈
- 浅谈 C++单例模式
- Java单例模式浅谈
- 单例设计模式浅谈
- 浅谈单例设计模式
- 统计uv
- web前端入坑第二篇:web前端到底怎么学?干货资料!
- python 学习笔记整理
- Java泛型-类型擦除
- js数组去重的4种方法
- 浅谈单例模式
- C++实现单向链表(2)
- 第一篇博客文章,记录自己的开始。
- hidden表单值无法重置的缺陷
- 如何跨域读取PDF文件
- mongodb总结
- 依赖注入
- 多元线性回归及梯度下降
- jQuery的LG的自定义插件。