Singleton模式
意图:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性:
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
优点:
对唯一实例的受控访问 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
缩小名空间 Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间
某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
写法:
1 //1.懒汉式,线程不安全,延迟加载 2 public class Singleton { 3 private static Singleton instance; 4 private Singleton (){} 5 6 public static Singleton getInstance() { 7 if (instance == null) { 8 instance = new Singleton(); 9 } 10 return instance; 11 } 12 }
1 //2.懒汉式,线程安全,延迟加载,效率低 2 public class Singleton { 3 private static Singleton instance; 4 private Singleton (){} 5 6 public static synchronized Singleton getInstance() { 7 if (instance == null) { 8 instance = new Singleton(); 9 } 10 return instance; 11 } 12 }
1 //3.双重检查锁定,延迟加载,线程安全 2 public class Singleton { 3 private static Singleton instance; 4 private Singleton (){} 5 6 public static Singleton getInstance() { 7 if (instance == null) { 8 synchronized(instance){ 9 if(instance == null){ 10 //JVM对此步骤有两个操作(分配空间并赋值给instance,初始化实例Singleton),先后顺序不分 11 // 如果先分配空间,完成后会释放锁,但是并没有实例,当另一个线程访问时出错 12 instance = new Singleton(); 13 } 14 } 15 } 16 return instance; 17 } 18 }
1 //4.静态内部类,延迟加载,线程安全 2 public class Singleton { 3 4 private Singleton (){} 5 6 private static class SingletonFactory{ 7 private static Singleton instance = new Singleton(); 8 } 9 public static Singleton getInstance() { 10 return SingletonFactory.instance; 11 } 12 }
1 //5.饿汉式,不延迟加载,线程安全 2 public class Singleton { 3 private static Singleton instance = new Singleton(); 4 private Singleton (){} 5 6 public static Singleton getInstance() { 7 return instance; 8 } 9 }
1 //6.饿汉式,不延迟加载,线程安全 2 public class Singleton { 3 private static Singleton instance = null; 4 static{ 5 instance = new Singleton(); 6 } 7 private Singleton (){} 8 9 public static Singleton getInstance() { 10 return instance; 11 } 12 }
参考:http://blog.csdn.net/zhangerqing/article/details/8194653
Gof设计模式 中文版