如何在java中使用双重检查锁实现单例-java开发java经验技巧

如何在java中使用双重检查锁实现单例-java开发java经验技巧

ID:31015764

大小:75.50 KB

页数:4页

时间:2019-01-05

如何在java中使用双重检查锁实现单例-java开发java经验技巧_第1页
如何在java中使用双重检查锁实现单例-java开发java经验技巧_第2页
如何在java中使用双重检查锁实现单例-java开发java经验技巧_第3页
如何在java中使用双重检查锁实现单例-java开发java经验技巧_第4页
资源描述:

《如何在java中使用双重检查锁实现单例-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、如何在Java中使用双重检查锁实现单例・编程开发技术如何在Java中使用双重检查锁实现单例本文illImportNew-行云流水翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。单例类在Java-7T-发者中非常常用,但是它给初级开发者们造成了很多挑战。他们所面对的其屮一个关键挑战是,怎样确保单例类的行为是单例?也就是说,无论任何原因,如何防止单例类有多个实例。在整个应用生命周期中,要保证只冇一个单例类的实例被创建,双重检查锁(DoublecheckedlockingofSingleton)是一种实现方法。顾名思义,在双重检查锁中,代码会检查两次

2、单例类是否冇已存在的实例,一次加锁一次不加锁,一次确保不会有多个实例被创建。顺便提一下,在JDK1.5中,Java修复了其内存模型的问题。在JDK1.5之前,这种方法会有问题。本文中,我们将会看到怎样用Java实现双重检查锁的单例类,为什么Java5Z前的版本双重检杳锁会有问题,以及怎么解决这个问题。顺便说一下,这也是重要的而试要点,我曾经在金融业和服务业的公司而试被耍求手写双重检查锁实现单例模式、相信我,这很棘手,除非你清楚理解了你在做什么。你也可以阅读我的完整列表“单例模式设计问题”来更好的准备面试。为什么你需要双重检查锁来实现单例类?一个常见情景,单例类在多线

3、程环境屮违反契约。如果你要一个新手写出单例模式,可能会得到下面的代码:privatestaticSingletoninstance;publicstaticSingletongetlnstance(){if(instance==null){instanee二newSingleton();}"rcturn_instancc;}"然后,当你指出这段代码在超过一个线程并行被调用的时候会创建多个实例的问题时,他很可能会把整个getTnstanceO方法设为同步(synchronized),就像我们展示的第二段示例代码getlnstanceTSO方法一样。尽管这样做到了线程安

4、全,并且解决了多实例问题,但并不高效。在任何调用这个方法的时候,你都需要承受同步带来的性能开销,然而同步只在第一次调用的时候才被需要,也就是单例类实例创建的时候。这将促使我们使用双重检查锁模式(doublecheckedlockingpattern),一种只在临界区代码加锁的方法。程序员称其为双重检查锁,因为会有两次检查—instance==null,一次不加锁,另一次在同步块上加锁。这就是使用Java双重检查锁的示例:publicstaticSingletongetlnstanccDC()//SingleChecked//Doublecheckedif(insta

5、nce==null){synchronized(Singleton.class){if(_instanee二二null){_instance=newSingleton();return_instanee;}"这个方法表而上看起来很完美,你只需要付出一次同步块的开销,但它依然冇问题。除非你声明—instance变量时使用了volatile关键字。没冇volatile修饰符,可能出现Java中的另一个线程看到个初始化了一半的_instance的情况,但使用了volatile变量后,就能保证先行发生关系(happens-beforerelationship)。对于vola

6、tile变量—instance,所有的写(write)都将先行发生于读(read),在Jewel5Znij不是这样,所以在这2前使用双重检杳锁有问题。现在,冇了先行发生的保障(happens-beforeguarantee),你可以安全地假设其会工作良好。另外,这不是创建线程安全的单例模式的最好方法,你可以使用枚举实现单例模式,这种方法在实例创建吋提供了内置的线程安全。另一种方法是使用静态持有者模式(staticholderpattern)o/**AjourneytowritedoublecheckedlockingofSingletonclassinJava.*/

7、classSingleton{privatevolatilestaticSingletoninstance;privateSingleton(){//preventingSinglctonobjectinstantiationfromoutside}/**1stversion:createsmultipleinstanceiftwothreadaccess*thismethodsimultaneously*/publicstaticSingletongetlnstance(){if(_instanee二二null){_instance二newSingleton(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。