设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

  今天所记录的补上昨天未完成的设计模式之单例模式

 饿汉式单例:

    设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

运行结果:

   设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

 在编写饿汉式单例时使用了final 关键字进行修饰所以不会出现多线程安全的情况产生。

接下来我们完善一下昨天的懒汉式单例:

   首先我们看一下昨天懒汉式单例的运行图:

    设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

    发现结果却是如同我们所期望的那样,在多次调用getInstance()时所获取到的对象,仍旧属于同一个对象。

    那么,我们来看看在多线程,情况下,还是如同一样的嘛?

    设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

 从上图可以发现我们多线程情况下的单例仍旧可以使用,还是保持只有一个对象。我们多运行几次看看。

 设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

嗯哼,怎么回事,我们已经运行了那么多次了,好像结果都是正确的,这说明我们的单例模式在多线程情况下也是正确的吗?

我们来一点好玩的东西,在getInstance()中加入线程休眠试试:

设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)

这里可以看出我们的单例模式其实并不是一个线程安全的,尤其是在多线程的情况下,会出现多个对象,这也意味着我们的单例模式,这里我们最简单的方法是使用synchronized方法进行修饰:

设计模式之单例模式(饿汉式+多线程情况下的懒汉式单例)


好了,今天要总结的有两点:

1.是饿汉式单例的使用。

2.懒汉式单例在多线程情况下一定要添加synchronized关键字进行修饰