Skip to main content

在一些程序设计中,希望对象只有一个实例,这时候就可以使用单例模式。

单例模式的实现,在语法上 用一个私有的构造方法来保护类不能在外部被 new 出来,然后提供一个静态方法返回唯一的实例即可。

应用场景,例如:系统配置,整个系统有一个配置对象即可,如果有配置修改,通知这个唯一的对象就好了,每次读取配置只需从这个唯一的对象中获取。

下面是一些常见的写法,以及优缺点:

代码一:

这是最简单的单例模式,在多线程的情况下依然能保持单例。

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,没有达到lazy loading的效果。

 

代码二:

在调用getInstance方法时才实例化对象,但多线程环境下会创建出多个对象。

代码三:

这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,除了第一次,其它情况都不需要同步。

代码四:

双检锁,解决同步锁的性能问题,只有还没实例化的时候才会锁

代码五:

通过内部类实现的,其它还有通过枚举实现的。

测试

  • test0:测试出普通类new出来的2个对象 地址和hashCode都不一样
  • test1:模拟线程测试,hashCode是一样的
  • test2:模拟线程测试,会有hashCode不一样的情况,这是多线程造成的。
  • test3:模拟线程测试,无论怎么测试,hashCode都一样
  • test4:模拟线程测试,无论怎么测试,hashCode都一样
  • test5:模拟线程测试,无论怎么测试,hashCode都一样

 




设计模式

单例模式
友链
XiuYu.Ge