单例模式
来源:互联网 发布:动画需要什么软件 编辑:程序博客网 时间:2024/06/09 20:38
培训马上就结束了,准备把这些天学到的知识点都归纳总结一下。
单例模式,没什么好说的,应该是23种设计模式中最简单的,听说是有五六种写法,饿汉式、懒汉式什么的,我也没去做认真地归纳,也没什么必要,目前以来我接触到的大体有下面这几种:
最好的写法
完美单例模式,单例模式使用内部类来维护单例的实现,
JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,这样当我们第一次调用getInstance的时候,JVM能够帮我们保证该对象只被创建一次
public class SingletonPerfect { private SingletonPerfect() { } private static class SingletonFatory { private static SingletonPerfect singleton = new SingletonPerfect(); } public static SingletonPerfect getSingleton() { return SingletonFatory.singleton; } // 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 public Object readResolve() { return getSingleton(); }}
最简单的写法
直接写成静态最终,谁也改不了,但是程序一开始就分配好空间,这样好不好,看具体应用场景。
public class SingletonOthers { private static final SingletonOthers singleton = new SingletonOthers(); private SingletonOthers() { } public static SingletonOthers getInstance() { return singleton; }}
我最喜欢的写法
在创建实例的方法上加同步锁,二次判断实例是否为空,注意不要在getSingleton方法上加同步锁,减少资源占用。
public class SingletonOthers { private static SingletonOthers singleton = null; private SingletonOthers() { } public static SingletonOthers getSingleton() { if (singleton == null) createSingletom(); return singleton; } private synchronized static void createSingletom() { if (singleton == null) singleton = new SingletonOthers(); }}
补充:影子实例
提供一个update方法的单例模式,数据已经很旧了,然后读取新的配置信息,然后更新数据,所以要提供这么个方法。
/** * @author ChenSS */public class SingleletonFactory { private static SingleletonFactory instance = null; private static Vector<String> properties = null; public Vector<String> getProperties() { return properties; } private SingleletonFactory() { properties=new Vector<>(); } private static synchronized void createInstance() { if (instance == null) instance = new SingleletonFactory(); } public static SingleletonFactory getInstance() { if (instance == null) createInstance(); return instance; } public void updateProperties() { SingleletonFactory sh = new SingleletonFactory(); //TODO 此处做读取最新的配置信息等更新数据操作 properties = sh.getProperties(); }}
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- MVC(JSP+JavaBean+Servlet)入门实例:用户登陆验证
- 深度解析K-L变换 及其 在特征识别中的应用
- 让你的伪造保持简单
- 线程中的sleep和wait的区别
- 分散层叠(Fractional Cascading)
- 单例模式
- 从 XML 到 XPath
- IOS蓝牙开发
- 剑指offer-两个栈实现一个队列
- php实现队列
- Python 之ConfigParser
- bootstrap 模态dialog
- 如何避免C++里的友元函数难题
- Java 泛型总结