http://blog.csdn.net/cselmu9/article/details/51366946java
单例模式安全
单例模式是对象的建立模式之一,此外还包括工厂模式。单例模式有以下几个特色:并发
1:该类只有一个实例。函数
2:该类自行建立该实例,在该类内部建立自身的实例对象。高并发
3:向整个系统公开这个实例接口。性能
package com.wbx.design; import test.C; public class Singleton { //私有,静态的类自身实例 private static Singleton instance = new Singleton(); //私有构造函数 private Singleton(){ //2:构造函数 System.out.println("aaaaaaaaa"); } //公开,静态的工厂方法 public static Singleton getInstance(){ //3 System.out.println("bbbb"); return instance; } C c = new C(); //1:属性类的构造函数 }
上面代码片断中引入建立对象C,为了看看类中代码的执行顺序。测试
public static void main(String[] args) { Singleton s1 = getInstance(); Singleton s2 = getInstance(); Singleton s3 = getInstance(); System.out.println("s1=="+s1); System.out.println("s2=="+s2); System.out.println("s3=="+s3); C c1 = new C(); //1:属性类的构造函数 C c2 = new C(); //1:属性类的构造函数 C c3 = new C(); //1:属性类的构造函数 System.out.println("c1=="+c1); System.out.println("c2=="+c2); System.out.println("c3=="+c3); }
测试结果优化
ccccccccccc aaaaaaaaa bbbb bbbb bbbb s1==com.wbx.design.Singleton@2f581b9f s2==com.wbx.design.Singleton@2f581b9f s3==com.wbx.design.Singleton@2f581b9f ccccccccccc ccccccccccc ccccccccccc c1==test.C@417d7c01 c2==test.C@1558473e c3==test.C@56ad4264
1:优势spa
a:减小内存消耗,特别是一个对象若是频繁地建立、销毁,并且建立或销毁时性能没法优化,这时采用单例模式的优点就很是明显。.net
b:当一个对象产生须要比较多的资源时,如读取配置、产生其余对象时,则能够经过在应用启动时直接产生一个对象,而后永久驻留内存的方式来解决(在Java EE中采用单例模式时须要注意JVM垃圾回收机制);
c:单例模式能够在系统中设置全局的访问点,优化共享资源的访问,例如能够设计一个单例类,负责全部数据表的映射处理。
2:缺点
a:单例模式没有接口,扩展很困难,接口对单例模式是没有任何意义,它要求“自行实例化”,而且提供单一实例、接口或抽象类是不可能被实例话的。
b:单例模式与单一职责原则有冲突。一个类应该只实现一个的逻辑,而不关系它是不是单例的,决定它是否是要单例是环境决定的,单例模式把“要单例”和业务逻辑融合在一个类中。