设计模式-单例模式
在程序中保证某类只有一个实例的几个方法:
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; } }