最近在学习设计模式,在看到单例模式的时候,我一开始以为直接很了解单例模式了,实现起来也很简单,但是实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,那么本文我们就来好好聊聊单例模式,说一下经典三种实现方式:饿汉式、懒汉式、登记式。并且解决掉多线程中可能出现的线程安全问题。
1.为什么要使用单例模式? 在我们日常的工作中,很多对象通常占用非常重要的系统资源,比如:IO处理,数据库操作等,那我们必须要限制这些对象只有且始终使用一个公用的实例,即单例。 2.单例模式的实现方式
3.单例模式的UML类图 4.单例模式的经典实现方式
1.单例类 2.测试类 3.测试结果
1.单例类 2.测试类 3.测试结果 细心的同学已经发现,这种实现方式,在多线程的环境中,是有线程安全安全问题的,有可能两个或多个线程判断instance都为null,然后创建了好几遍实例,不符合单例的思想,我们可以对它进行改进。
原理:使用JDK的synchronized同步代码块来解决懒汉式线程安全问题。 1.单例类 2.测试结果
原理:使用JVM隐含的同步和类级内部类来解决,JVM隐含的同步解决了多线程情况下线程安全的问题,类级内部类解决只有使用的时候才加载(延迟加载)的问题。 1.JVM隐含的同步有哪些?
2.什么是类级内部类?
3.单例类 4.测试类 5.测试结果
1.基类 2.子类1 3.子类2 4.测试类 5.测试结果 该解决方案的缺点:基类的构造函数对子类公开了(protected),有好的解决方案的博友可以讨论指教~
经过本文,我们就搞明白了什么叫单例模式,如何优雅的实现经典的单例模式,如何进行拓展和开发具有线程安全的单例模式。对于我们以后的开发非常有帮助,也让我们更加了解单例模式。 |
|