单例模式
来源:互联网 发布:淘宝网人民法院拍卖 编辑:程序博客网 时间:2024/06/08 10:01
这应该是所有设计模式中最简单的设计模式了,所以从它讲起。
用途
用来创建独一无二对象。确保只有一个实例,并且提供一个全局访问点(getSingleton)。
v0.0.1-简单实现
/** * Created by Acceml on 2016/5/28. * Email: huminghit@gmail.com */public class Singleton { private static Singleton singleton; private Singleton() { } public static Singleton getSingleton() { if(singleton == null) {//risk return new Singleton(); } return singleton; }}
要注意的点是:
- 单例模式没有public的construct
- 有一个静态的对象,每次getSingleton()的时候获得的是同一个
这样写的问题是:
多线程的时候回出问题,比如我们有两个线程thread0,thread1去同时调用getSingleton()这个方法,就会在if(singleton == null)出现问题。thread0,thread1都认为没有该判断为true,就会去创建两个对象,没有多线程的时候,这样使用没有问题。
V0.0.2-双重锁实现
/** * Created by Acceml on 2016/5/28. * Email: huminghit@gmail.com */public class Singleton { private volatile static Singleton singleton; private Singleton() { } public static Singleton getSingleton() { if(singleton == null) {//判断1 synchronized (Singleton.class) { if(singleton == null) {//判断2 singleton = new Singleton(); } } } return singleton; }}
变化有:
- 加了volatile关键字
- 加了双重锁
加volatile很容易理解,因为加上该关键字,那么变量就对不同线程可见。在方法getSingleton()中,第一个判断不存在,就进入同步块,进入同步块之后再判断一次,还是为null才创建实例。但是为什么这么做呢?假如thread0执行到判断1,它进入同步区之后,thread2就进不来了,从而保证只有一个线程执行到判断2。
v0.0.3-eager实现
上面两种方法都是我们需要的时候去做判断,然后实例化,如果创建对象负担不重的话,可以考虑在静态初始化的时候创建对象。
/** * Created by Acceml on 2016/5/28. * Email: huminghit@gmail.com */public class Singleton { private volatile static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getSingleton() { return singleton; }}
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- 编码相关问题整理
- 模拟时间片轮转算法(C++)
- JavaScript基础
- vs2010添加外部头文件
- invokevirtual、invokespecial、invokestatic、invokeinterface、invokedynamic介绍
- 单例模式
- Binary Watch问题及解法
- 安卓开发中将activity设成translucent导致输入法遮挡edittext,windowSoftInputMode设置无效问题
- ORA 各种oraclesql错误
- ACdream 1031 Cut
- 【字符串】最长无重复子串Longest Substring Without Repeating Characters
- Dubbo学习(五)结果缓存
- 策略模式使用的小技巧
- PRML读书笔记——连续潜在变量