单例模式-实战

单例模式:前面的一篇文章,曾经对单例模式进行了一个基本的认知

今天通过代码来一步步优化单例模式

demo1 

demo2

所谓的懒汉式:就是使用时才会去创建;但是,该方式会有问题:如果在多线程情况下,会产生两个对象

demo3

由demo3我们可以看到,通过synchronized加锁方式,从多线程角度来看,Synchronized放到方法上会影响性能。于是我们不难想到将其放到方法里。

demo4

其实到了这一步,这种方式其实还是有问题的,当线程1和2都执行到了 if (instance == null)的判断语句(还未加锁),这种情况最后也会产生两个对象,于是,我们想到  锁里面再加一个是否为空的判断

demo5

这一步,我们实际是通过 double-checked locking (DCL) 来进行控制 ;此时,很多人都会觉得无懈可击了;从多线程角度来看,这样写的单例确实没有问题了,但从Java的类创建原理来看,可能还有问题;

从浅显简单的理解来看,就是对象还未完全创建出来,但instance变量已被赋值,此时另一个线程获取实例时,会得到instance,但它的堆空间及相关的方法还未完成时,调用实例方法就会出错。

demo6

对象的创建过程,后期会专门进行一次分享

你可能感兴趣的:(单例模式-实战)