单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。用户程序调用时不是每次生成一个新的实例,而是都调用该类的一个唯一的实例。

  单例模式(Singleton)它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

  实现方式一

  

 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 Singleton instance = new Singleton(); 
     static {  
     }  
     private Singleton (){}
     public static Singleton getInstance() {  
     return this.instance;  
     }  

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

 

  实现方式四

 

public class Singleton {  
     private static class SingletonHolder {  
     private static final Singleton INSTANCE = new Singleton();  
     }  
     private Singleton (){}
     public static final Singleton getInstance() {  
         return SingletonHolder.INSTANCE;  
     }  
 }  

 

   该方式通过内部静态类实现instance的实例化,避免了第三种方式在类加载时就实例化的问题,只有在调用getInstance方法时才主动去实例化,实现了lazy loading的效果。

 

  实现方式五

 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;  
     }  
 }  

   经典的Double-Checked Locking方法

 

 

  

 

 

 

 

 

posted on 2014-03-14 17:36  魔渊  阅读(241)  评论(0)    收藏  举报