在最初学习设计模式时,我为绝佳的设计思想激动不已,在以后的project中。多次融合设计模式,而在当下的设计中。我们已经觉察出了当初设计模式的高瞻远瞩。可是也有一些不足,须要我们去改进。有人说过。世界上没有绝对的事,当然,再简单的事情,环境变了,也会发生变化,今天和大家一起分享在多线程下单例模式的优化。

1,传统

首先,我们回想下传统的单例(懒汉式)是怎样工作的:

public class SingletonClass{
private static SingletonClass instance=null;
public static SingletonClass getInstance()
{
if(instance==null)
{
instance=new SingletonClass();
}
return instance;
}
private SingletonClass(){
}
}

我们不难看出,在多线程执行时,普通的代码会带了困恼,大家看多线程代码执行时的图片:

2,双重锁

我们看到线程1和线程2都运行了代码②,我们得到的并非一个单例的对象,而是多个对象。针对这些我们进行了同步的优化。

public static class Singleton{
private static Singleton instance=null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null==instance){
instance=new Singleton();
}
}
}
return instance;
}
}

我们在看看这样的代码的多线程执行图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

大家看,③只执行了一次。不不过它被同步机制保护了,并且是进行了双重判定。这样保证多线程下单例模式的正常执行。

3,枚举

在jdk1.5之后。java注意到这一细节,在创建单例应用时,我们能够利用枚举类型完毕我们的工作,而且他是线程安全的。

源代码:

public enum SingletonEnum
{
    INSTANCE;
    private String name;
    publicString getName()
    {
       returnname;
    }
     publicvoid setName(String name)
    {
       this.name = name;
    }
 }

这样的优化,使我们更优雅地适用代码。可是也带来了一定的问题,就是我们对对象的类型有了模糊的概念,所以在工作中,还是建议保留双锁模式,对一些工具类则能够採取枚举类型优化,简化我们的代码与逻辑。

总结:

细节的优化。就像雕琢一件艺术品,我们接触的高人越多。这种思想就越浓厚,所以,我们经常推断一个人事怎么的品格与素养,通过他接触的人。朋友就能够猜測出来,而计算机内。也是如此,我们接触的优秀框架多了。自己自然就是优秀的设计师。

最新文章

  1. js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
  2. Vmware玩mac os x分享
  3. 使用 Python 切割图片
  4. shell 初学者 必读 ,强烈推荐新手读
  5. 完成端口(CompletionPort)详解
  6. TRIZ系列-创新原理-29-气动或液压结构原理
  7. HDU 1248 冰封王座(dp)
  8. 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
  9. Quartz源码——QuartzSchedulerThread.run() 源码分析(三)
  10. Solidity constant view pure关键字的区别与联系
  11. CAN通信帧ID如何设定?
  12. Spring+Redis集成+关系型数据库持久化
  13. 通过GUID确保winform运行唯一实例
  14. debug,菜鸟必备的求生技能
  15. ionic 访问odoo11之具体业务类api接口
  16. Log4j maven依赖配置
  17. Shell脚本编程实战一:创建按天备份的脚本工具
  18. gpu内存查看命令nvidia-smi
  19. iOS 设备的CPU架构以及查看framework支持架构
  20. [转]HTML DIV+CSS 命名规范大全

热门文章

  1. FileZilla Server安装配置教程
  2. vue的使用配置
  3. Mac 配置 php-fpm
  4. 「LibreOJ β Round #3」绯色 IOI(抵达)
  5. c和c++如何把一个整数转化为string
  6. 解决hibernate产生的id序列或者setXX不能同步到数据库到问题(this.hibernateTemplate.flush();hibernateTemplate.getSessionFactory().getCurrentSession().connection().commit())
  7. POJ 2002 几何+hash
  8. hdu 4710
  9. C#中对字符串的加密和解密
  10. unbuntu下安装多个JAVA JDK版本及如何切换