欢迎来到天天文库
浏览记录
ID:40311742
大小:138.50 KB
页数:6页
时间:2019-07-30
《浅议单例模式之线程安全》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、浅议单例模式之线程安全作者:远航的兵时间:2013-01-30[摘要]单例模式是一种常见的设计模式,在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。这种方式只需访问该单例对象即可达到统一但是在多线程环境下,但是随着应用场景的不同,也可能带来一些同步问题。 本文将探讨一下在多线程环境下,使用单例对象时可能会带来的同步问题,并给出可选的解决办法。[关键字]Java设计模式单例线程同步双重检查锁[概念]单例模
2、式分类:懒汉式单例、饿汉式单例两种。单例模式特点: 1、单例类只能有一个实例 2、单例类必须自己自己创建自己的唯一实例 3、单例类必须给所有其他对象提供这一实例单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例[问题描述]面试的时候,大家也许会被问到这样一个问题:请您写出一个单例模式(SingletonPattern),当然都感觉比较简单,代码如下:/***演示单例模式之饥饿模式*@authorAdministrator**/publicclassEagerSingleton{privatestat
3、icEagerSingletoninstance=newEagerSingleton();privateEagerSingleton(){}publicstaticEagerSingletongetSingleInstance(){returninstance;}}这种写法就是所谓的饥饿模式,每个对象在没有使用之前就已经初始化了。这就可能带来潜在的性能问题:如果这个对象很大呢?没有使用这个对象之前,就把它加载到了内存中去是一种巨大的浪费。针对这种情况,我们可以对以上的代码进行改进,使用一种新的设计思想——延迟加载(Lazy-
4、loadSingleton)。/***演示单例模式之懒汉模式*@authorAdministrator**/publicclassLazySingleton{privatestaticLazySingletoninstance;privateLazySingleton(){}publicstaticLazySingletongetSingleInstance(){if(instance==null){instance=newLazySingleton();}returninstance;}}这种写法就是所谓的懒汉模式。它使用
5、了延迟加载来保证对象在没有使用之前,是不会进行初始化的。但是,通常这个时候面试官又会提问新的问题来刁难一下。他会问:这种写法线程安全吗?回答必然是:不安全。测试结果:这是因为在多个线程可能同时运行到判断instance为null,于是同时进行了初始化。所以,这是面临的问题是如何使得这个代码线程安全?很简单,在那个方法前面加一个Synchronized就OK了。/***演示单例模式之线程安全*@authorAdministrator**/publicclassThreadSafeSingleton{privatestaticT
6、hreadSafeSingletoninstance;privateThreadSafeSingleton(){}publicstaticsynchronizedThreadSafeSingletongetSingleInstance(){if(instance==null){instance=newThreadSafeSingleton();}returninstance;}}写到这里,面试官可能仍然会狡猾的看了你一眼,继续刁难到:这个写法有没有什么性能问题呢?答案肯定是有的!同步的代价必然会一定程度的使程序的并发度降低。
7、那么有没有什么方法,一方面是线程安全的,有可以有很高的并发度呢?我们观察到,线程不安全的原因其实是在初始化对象的时候,所以,可以想办法把同步的粒度降低,只在初始化对象的时候进行同步。[解决方案]这里有必要提出一种新的设计思想——双重检查锁(Double-CheckedLock)。/***演示单例模式之双重锁定*@authorAdministrator**/publicclassDoubleCheckedSingleton{privatestaticDoubleCheckedSingletoninstance;privateD
8、oubleCheckedSingleton(){}publicstaticsynchronizedDoubleCheckedSingletongetSingleInstance(){//性能改进——双重锁定:Double-CheckLockingif(instance==null)//1.
此文档下载收益归作者所有