Java:单例模式的七种写法

转载 2015年07月09日 09:55:58


转自:http://blog.csdn.net/magister_feng/article/details/6602756 

第一种(懒汉,线程不安全): 
Java代码  收藏代码
  1. public class Singleton {  
  2.       
  3.     private static Singleton instance;  
  4.     private Singleton(){}   
  5.     public static Singleton getInstance() {  
  6.         if (instance == null) {  
  7.             instance = new Singleton();  
  8.         }  
  9.         return instance;  
  10.     }  
  11. }  

这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 

第二种(懒汉,线程安全): 
Java代码  收藏代码
  1. public class Singleton {  
  2.     private static Singleton instance;  
  3.     private Singleton(){}  
  4.     public static synchronized Singleton getInstance() {  
  5.         if (instance == null) {  
  6.             instance = new Singleton();  
  7.         }  
  8.         return instance;  
  9.     }  
  10. }  

这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。 

第三种(饿汉): 
Java代码  收藏代码
  1. public class Singleton {  
  2.     private static Singleton instance = new Singleton();  
  3.     private Singleton(){}  
  4.     public static Singleton getInstance() {  
  5.         return instance;  
  6.     }  
  7. }  

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。 

第四种(饿汉,变种): 
Java代码  收藏代码
  1. public class Singleton {  
  2.     private static Singleton instance = null;  
  3.     private Singleton(){}  
  4.     static {  
  5.         instance = new Singleton();  
  6.     }  
  7.   
  8.     public static Singleton getInstance() {  
  9.         return instance;  
  10.     }  
  11. }  


第五种(静态内部类): 
Java代码  收藏代码
  1. public class Singleton {  
  2.     private static class SingletonHolder {  
  3.         private static final Singleton instance = new Singleton();  
  4.     }  
  5.     private Singleton(){}  
  6.     public static final Singleton getInstance() {  
  7.         return SingletonHolder.instance;  
  8.     }  
  9. }  

这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。 

第六种(枚举): 
Java代码  收藏代码
  1. public enum Singleton  
  2. {  
  3.     INSTANCE;  
  4.     public void whateverMethod() {  
  5.     }  
  6. }  

这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。 

第七种(双重校验锁): 
Java代码  收藏代码
  1. public class Singleton {  
  2.     private volatile static Singleton singleton;  
  3.     private Singleton(){}  
  4.     public static Singleton getSingleton() {  
  5.         if (singleton == null) {  
  6.             synchronized (Singleton.class) {  
  7.                 if (singleton == null) {  
  8.                     singleton = new Singleton();  
  9.                 }  
  10.             }  
  11.         }  
  12.         return singleton;  
  13.     }  
  14. }  

这个是第二种方式的升级版,俗称双重检查锁定,详细介绍请查看:http://www.ibm.com/developerworks/cn/java/j-dcl.html 

设计模式之单例模式的7种写法

一、概述在介绍单例模式的写法之前,我们有必要了解一下什么是单例模式。 单例模式是一种常用的软件设计模式,在他的核心结构中只包含一个被称为 单例的特殊类。通过单例模式可以保证系统只有一个实例而且该实例易...
  • u012507894
  • u012507894
  • 2016年01月19日 11:01
  • 759

Android设计模式之单例模式的七种写法

一 单例模式介绍及它的使用场景单例模式是应用最广的模式,也是我最先知道的一种设计模式,在深入了解单例模式之前,每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的...
  • happy_horse
  • happy_horse
  • 2016年04月15日 19:44
  • 7384

Java单例模式的各种写法和最优写法推荐

话不多说,直接上代码: (1) //只适合单线程环境,懒汉模式 class Singleton{ private static Singleton Instance = null; ...
  • chenbaige
  • chenbaige
  • 2016年05月24日 18:55
  • 2890

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016年01月17日 10:29
  • 24292

JAVA单例模式的各种写法分析,最优为枚举

作用 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 适用场景 应用中某个实例对象需要频繁的被访问。 应用中每次启动只会存在一...
  • tianyazaiheruan
  • tianyazaiheruan
  • 2016年02月03日 10:26
  • 4230

单例模式的七种写法以及注意事项

第一种(懒汉,线程不安全):   Java代码   public class Singleton {      private static Singleton instance...
  • yawinstake
  • yawinstake
  • 2017年01月16日 22:43
  • 602

Java 单例模式的七种写法

第一种(懒汉,线程不安全): public class Singleton {    2     private static Singleton instance;    3     ...
  • chow__zh
  • chow__zh
  • 2013年05月06日 17:03
  • 3324

java设计模式之单例模式(几种写法及比较)

概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。  ...
  • tolcf
  • tolcf
  • 2015年10月21日 22:56
  • 6287

单例模式的七种写法 (Java)

第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singl...
  • wochunyang
  • wochunyang
  • 2016年11月15日 14:15
  • 208

单例模式Java的七种写法

摘要: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 单例模式算是开发中使用比较多的...
  • weixin_39113426
  • weixin_39113426
  • 2017年12月01日 16:23
  • 48
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java:单例模式的七种写法
举报原因:
原因补充:

(最多只允许输入30个字)