Spring单例模式的一次失败经历和
 今天看到一个网友骂Spring singletom是个骗子,所以进去仔细看了。
原文如下
这次被骗代价十分惨重,特此分享以警后人。
简单说说这次经历。事情发生在2006年7月6日。

我们准备设计log系统。采用p6spy,我们订制了一个自己的log输出类。每次logclass生成一个实例,就把他加进一个Set中。在读取sql log的时候,我们使用一个静态方法从一个维护logobject的Set中读出一个logobject,使用这个实例来输出。原则上多线程的操作是要同步的,但是考虑到效率问题,头们决定只是在生成一个logclass实例并向Set中添加时进行同步,而读取时不进行同步。原因就是,我们把 logclass设置成了单态,也就是原则上它只有一个实例。即使多个应用同时启动,也只有固定数量的实例。而这些实例都应该随着web启动而全部预加载。好,大头拍板了,就这么干。

于是,一个恶根被埋下,并在不知不觉地生长。两年来以半年左右一次的频率,一个Exception不断撩拨着我们的神经。客户那边随着 exception的发生也不断有人来问不过开发人员谁也没有在意,毕竟这个例外很友好,它发生在log输出阶段,发生之后会缺失一段log,不过这不算什么影响,大家都以为不用去管,看这个还不如去喝喝茶聊聊天。
今年9月,也就是这个月初。客户突然要求对这个不知所谓的东西严密调查,不然就怀疑我们框架的严密性。好家伙,这些平时温和的客户终于爆发了。好吧,调查。

首先跟踪log.发现在发生这个ConcurrentModificationException发生之前有一次类加载。难道类被重新加载了?如果类被重新加载,基于我对springsingleton的误解,于是我做了一个误判。那就是类被gc掉了。这当然不是没有可能的,如果长时间的闲置,类被回收那么类的静态量就会被重置,那么如果一个线程访问中间静态量被重置的话,那么就极有可能发生异常。我这样判断还有一个原因,springsingleton的类实例只有一个,而我用的都是静态方法,也就是没有引用实例,如果gc,那么这个类的实例很可能被收调,没有实例引用,静态量引用不足以阻止gc。于是接下来我这对我的推断作了一个周的实验,强制gc作了n多遍,无果。我开始对自己的判断产生怀疑,于是仔细察看代码和 log。突然发现几个异常出现都是在web service 开始的一段时间。难道是web service搞得鬼?于是打开web service源代码。一个异常点展现在我面前。每次调用web service,他都会将用到的类重新加载,包括logclass.这样就产生了新的推论。某个线程在访问log class的静态量Set时由于webservice的加载使得set发生变化从而引发异常。试验一下果然如此。

人说千里之堤溃于蚁穴看来不假。如此小的问题竟使得别人对我们的框架产生怀疑,可叹。

总结一下,spring singleton的含义是在一个spring 上下文中保持单态,如果一个jvm上多次加载spring context将使得单态的意义不复存在,与此会产生同步等问题。希望能给大家一些参考。

个人观点:
每次调用web service,他都会将用到的类重新加载,包括log class.

这个是关键。为何每次都会重新加载?

我们看一下Spring的工厂方法。 我们指定了一个application.xml作为配置文件。

如果我们有2个工厂方法呢?他们是2套完全不同的配置,那么所谓的单例还存在吗?

呵呵,不用猜,他们各自使用各自的,不会互相干扰的。

所以。单例一定要在类一级实现,不要指望Spring给你实现。如此,也只能保证一个Context下面的类是单例的。

如果有虚拟主机,虚拟目录,他们的ClassLoader是独立的,同样无法实现单例。

Spring单例模式的一次失败经历和总结相关推荐

  1. 30岁面霸IT男30次面试失败经历

    30岁面霸IT男30次面试失败经历[问题点数:2分] CSDNATM (Follow my heart) 等 级: 结帖率:96.58% 楼主发表于:2010-04-15 14:14:07背景:硕士, ...

  2. java授权失败_自定义Spring Security的身份验证失败处理方法

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...

  3. 关于spring mvc时间类型绑定失败解决方法

    关于spring mvc时间类型绑定失败解决方法 前端页面用的easyui,有个日期字段: <input name="sdt" class="easyui-date ...

  4. win10下装win7双系统_B360主板装win7+win10双系统失败经历分享

    本文章并不是教程(但也包含着一点),而是失败经历的分享 通过我过去几天装win7+win10双系统的艰辛以及遇到的困难,我劝各位还是安心用win10吧,别折腾了.. 但是可能我会专门写一篇讲如何在B3 ...

  5. spring单例模式与线程安全问题的解决方案

    一句话总结:1:spring容器创建对象的方式是单例的 2:spring单例模式的安全问题是使用ThreadLocal解决的 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行 ...

  6. android+高仿iphone,网购iPhone7P的失败经历,原来是安卓高仿!

    原标题:网购iPhone7P的失败经历,原来是安卓高仿! 大家都有网购的经历,有时候能买到便宜的好货,有时候却差强人意!但是大多人还是幸运的,为什么呢?因为他们至少在买手机没有上过当,但是当骗子遇到小 ...

  7. 记一次Spring AOP拦截处理CXF WebService的失败经历

    需要实现一个功能,即记录每次webservice服务调用的一些参数,比如调用时间,执行时间等.原来的产品是使用axis开发的,接到这个功能的时候便想着采用Spring AOP结合CXF的方式来实现,于 ...

  8. 四轮面试阿里菜鸟网络 Java 程序员,失败经历记录分享!

    >>号外:关注"Java精选"公众号,回复"面试资料",免费领取资料!"Java精选面试题"小程序,3000+ 道面试题在线刷, ...

  9. java flow step,即使步骤完成,使用FlowBuilder的Spring Batch作业也会失败

    我有一个Spring批处理作业,它成功完成了这些步骤,但将整个批处理作业状态标记为Failed . 这项工作有两个步骤 . 第一步验证输入文件并为我们正在处理的文件类型设置变量 . 使用Tasklet ...

  10. java spring 单例模式,spring中的单例模式

    spring依赖注入的bean默认都是单例模式,他们是怎么创建的? 在AbstractBeanFactory类中的getBean方法中调用了getSingleton()方法来创建bean: @Null ...

最新文章

  1. 死锁产生的原因和解锁的方法
  2. python学起来难不难-Python为什么那么受欢迎?学习Python难不难?
  3. python startswith
  4. YOLOV3 --BUG---No labels in D:\yolov5\train_data\train.cache. Can not train without labels.
  5. QQ协议调试器 QQDebugger
  6. 扩展Guava缓存溢出到磁盘
  7. Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar
  8. 2019年最好的前端进阶课,合同保障不过20w年薪全额退款!
  9. 《童梦奇缘-梦幻般的羁绊》第一章-朦胧
  10. Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
  11. 利用第三方rec解锁安卓手机锁屏密码
  12. Sniffer和网络执法官软件助你维护网络
  13. linux rhel 7系统启动过程
  14. php 微信上传多张图片,php,微信_微信jssdk能上传多张图片吗?,php,微信,javascript - phpStudy...
  15. FTP软件的安装及上传/下载方法
  16. Xcelsius 2008 sp3的新部件与新功能
  17. ArcGIS校园3D展示图制作详细教程
  18. 简记_插件电阻功率选型及使用注意事项
  19. 清华大学c语言程序设计期末试卷,清华大学出版社C语言程序设计习题.doc
  20. 快速上手云原生安全平台 NeuVector

热门文章

  1. Vue中引用图片动态背景图片
  2. LaTeX 插入章节和目录
  3. 测试常见面试题,如何有效的做自我介绍
  4. python 调用word打开doc文档报错,“word无法启动转换器mswrd632.wpc”
  5. [转]让你的网页文本框增加光晕效果与提示,水印(类似QQ2011)
  6. c语言学习笔记(持续更新中)
  7. 懒人神器,IDEA插件之EasyCode,自动生成CRUD代码
  8. android配置wifi,详解Android通过修改配置文件设置wifi密码
  9. Python带你把喜欢的视频保存~采集无水印视频
  10. GitHub又放大招,Python版本的植物大战僵尸还能作弊玩!