单例模式的写法
2016-04-13 21:55
316 查看
第一种(懒汉,线程不安全):
第二种(懒汉,线程安全):
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第三种(饿汉):
这种方式基于
第四种(饿汉,变种):
第五种(静态内部类):
第六种(枚举):
第七种(双重校验锁):
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; } }
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第三种(饿汉):
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
这种方式基于
classloader机制,在深度分析Java的ClassLoader机制(源码级别)和Java类的加载、链接和初始化两个文章中有关于classload而机制的线程安全问题的介绍,避免了多线程的同步问题,不过
instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用
getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化
instance显然没有达到
lazy loading的效果。
第四种(饿汉,变种):
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; } }
相关文章推荐
- 计算机常识
- 220. Contains Duplicate III set的应用
- java实现矩阵连乘的动态规划
- select模型实现分析
- C++ primer 读书笔记 第七章 --函数
- 分布式服务通讯
- ubuntu安装pip+python27+ipython+scrapy+zlib-及遇到的各种问题解决
- ubuntu-pip+python27+ipython-安装-及遇到的各种问题解决
- 态度
- CSS3---变形与动画效果
- get与post(转)
- 对同一个表中不同的字段进行升序蒋序的操作sql中排序的误区
- 关于百度,google map的url api的调用
- 了解数据库
- Hbase之Java API使用
- [BZOJ1004] [HNOI2008] Cards - 群论,Burnside引理,Polya定理
- HashMap的indexFor方法
- AJAX可以统计下载次数吗
- Phantomjs 调试方法
- js跨域数据传输