self-confidence,the source of all the power

导航

设计模式-单例模式

 

  在程序中保证某类只有一个实例的几个方法:

  1.  classic singleton pattern

 1 public class Singleton {
 2    private static Singleton uniqueInstance ;
 3    private Singleton() {}
 4    public static Singleton getInstance() {
 5           if (uniqueInstance == null) {
 6                   return new Singleton();
 7            }
 8            return uniqueInstance;
 9     }
10 }

    缺点: 当运行在多线程环境下,该方法仍然可能会造成同时创建两个以上的实例, 绝对是一大隐患啊,必须要杜绝。

  2.  让经典单例模式可以适应多线程的情况,有好几种方法可以改进,比如说同步锁(synchronized 语句).

 1 public class Singleton {
 2    private static Singleton uniqueInstance ;
 3    private Singleton() {}
 4    public static synchronized Singleton getInstance() {  //同步整个创建实例的方法,即保证该方法在任何时候都仅能由一个线程操作
 5           if (uniqueInstance == null) {
 6                   return new Singleton();
 7            }
 8            return uniqueInstance;
 9     }
10 }

 缺点: 由于在整个程序运行过程中,该实例只需要被运行一次,而在每次invoke getInstance()时都要同步一次,这会大大降低程序运行性能,同步一个方法大约会降低运行效率的100倍。

  3. 减少同步的代码 

 public class Singleton {
     private volatile static Singleton uniqueInstance ;   //volatile 让每个线程都能正确读取uniqueInstance的值
     private Singleton() {}
     public static Singleton getInstance() {            
           if ( uniqueInstance == null) {       // 保证了只在创建实例时同步,即整个过程中只需同步一次代码
             synchronized(Singleton.class) {
                if (uniqueInstance == null) {
                      return new Singleton();
                 }
             }
           }
           return uniqueInstance;
      }
 }

  缺点: 受限于java版本,由于JVM对volatile 实现的关系,java5 之前的版本可能不能进行有效的同步机制检查。

  4. 在线程调用实例前,实例化它

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
           return uniqueInstance;
    }
}

 

posted on 2013-10-28 16:18  漩涡鸣人  阅读(211)  评论(0编辑  收藏  举报