Spring单例模式的一次失败经历和总结

记一次“大华”的面试经历 如题,这是一篇关于大华面试的分享,之所以标题中的大华加上双引号是因为这次的面试并不是大华直接发的面试邀请,而是通过外派的形式进入大华,由大华的技术负责人面试。写这篇文章的目的有两点:    1、梳理自己的面试过程,让自己对知识点有更清晰的理解,将面试过程中没答上的问题进行回顾理解;    2、为在准备面试特别是面试大华的人给一点小小的帮助。 一、面试流程 大华下午上班时间是1点半,约好的时间也是1... 阅读详情
 今天看到一个网友骂 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是独立的,同样无法实现单例。
优惠券管理 (请设计一个优惠券兑换码生成方案,可以支持20亿以上的唯一兑换码,兑换码长度不超过10,只能包含字母数字,并且要保证生成和校验算法的高效)最后把签名值的后14位、新鲜值(4位)、自增序列(32位)拼接,得到一个50位二进制数,然后与一个较大的质数做异或运算加以混淆,再基于Base32或Base64转码,即可的对兑换码。现在,就剩下防止爆刷了。自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位,距离50个bit位的限制还有很大的剩余,符合要求! 阅读详情

相关推荐

基于RYU+Mininet的SDN校园网络实战:从零搭建虚拟化实验环境

本文详细介绍了如何利用RYU控制器和Mininet搭建SDN校园网络实验环境,从Ubuntu虚拟机准备到网络拓扑设计,再到关键网络功能实现。通过实战案例展示SDN在校园网络中的应用优势,包括简化配置、提升效率等,为网络工程师和学生提供了一套完整的虚拟化实验方案。

weixin_30872499的博客 458

单例模式静态内部类实现遇到的类加载失败的坑:ExceptionInInitializerError

背景:写一个工具的时候遇到一个需要使用单例模式的场景,由于该实例消耗资源大且不一定会使用到,因此比较适合用懒汉模式实现。然后直接用的简单高效的静态内部类方式实现。然后就遇到问题了,在首次获取单例对象加载内部类时,会初始化类的静态属性,于是初始化单例对象时如果创建失败(构造方法抛出异常)就会导致内加载失败。并且由于类只会加载一次(加载失败了后面貌似也不会重新加载了),所以后面就一直抛异常,而且异常类型变为 `NoClassDefFoundError`。...

Wu_Shang001的博客 1157

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 277

Web Service单例模式

Web Service单例模式,加快访问效率 private static IJFYFrontService service = null;

woaixiaomai的专栏 785

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1032

RV1106 SDK 软件开发环境

5.30.1 如何开启休眠唤醒功能以project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-NONE-RV1106_EVB1_V11-IPC.mk为例:5.30.2 休眠唤醒方案简介SDK的休眠唤醒采用的方案为:进入休眠状态描述:用户层收到触发事件后,暂停业务流程并主动调用echo mem > /sys/power/state命令使系统进入休眠状态。

xzjiang_365的博客 4253

关于饿汉式单例首次初始化失败后,可以再次尝试?

思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?   环境HotSpotJVM 1.6   /** * * @author lidongbo * @date 2012-7-11 */ public class Foo {       pri...

运斤成风 314

AntV G6避坑指南:折叠树状图那些意想不到的BUG(附解决方案)

本文深入剖析了在React项目中使用AntV G6实现折叠树状图时,从图标错乱、数据同步到状态管理的常见BUG与解决方案。文章基于实战经验,详细解读了G6的内部机制,提供了从环境配置、自定义节点绘制到事件处理与性能优化的完整避坑指南,帮助开发者彻底解决折叠展开功能的疑难杂症。

wasm7browser的博客 257

Spring 单例模式的一次失败经历和总结

 这次被骗代价十分惨重,特此分享以警后人。 简单说说这次经历。事情发生在2006年7月6日。 我们准备设计log系统。采用p6spy,我们订制了一个自己的log输出类。每次logclass生成一个实例,就把他加进一个Set中。在读取sqllog的时候,我们使用一个静态方法从一个维护logobject的Set中读出一个logobject,使用这个实例来输出。原则上多线程的操作是

蒋珍波的专栏 709

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 420

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 519

为什么对研发情有独钟

相信很多猿仔都和我一样,学到知识总想着在实际工作中快速用到,这样就算暴露处理错误,也方便我们加深对知识的理解。 不才,年初想着使用策略+模板方法的设计模式去重构我们项目中臃肿的代码,上去就是一通撸。经过自测之后,满意地露出了淫荡的笑容... 然而,之后的工作时间中,总会有一些匪夷所思的数据出现,比如,短信接收者吐槽不是他的数据,为何他收到短信;再者,数据不一致等现象。 仔细检查代码,也没发现我这惊为天人的代码逻辑有何不妥之处,而且自己反复测试还是没有问题复现,故想着莫非用户...

帝都的雁的博客 981

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

记一次向Spring官方提交PR的失败经历

一、事情始末 周末无聊在家,打开Spring源码,想再温习一遍之前学习过的流程,忽然看到一段代码,就是在执行BeanFactoryPostProcessor的逻辑中我发现了这样奇怪的一幕: 于是我就把代码改成这个样子(草率了) 于是乎,整个代码都简便多了,当时随手写了一个测试类,没报错就直接提交到Spring项目上了,然后申请合并了,当我怀着激动地心,颤抖的手,提交完成之后,一天我都十分亢奋,是不是的打开github,看看作者回复了我没有! 二、终于,草率了! 到了下午三四点左右的时间,作者回复我了(都

皇甫嗷嗷叫 388

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

记一次feignClient导致的启动失败经历

spring cloud starter feign 1.4.4.RELEASE 一、基本排错过程及原因 项目启动报错如下: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'xService' defined in class path res...

GAOXINXINGgaoxinxing的博客 3647

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

记一次接口使用json格式绑定参数失败的经历

记一次接口使用json格式绑定参数失败的经历 控制台报错信息: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public void com.hwx.webtest.controller.ReqParamTestController.testPost2(com.hwx.webtest.req.ReqVo)] 接口报错信息: {

weixin_41442734的博客 537

从一次启动失败深入剖析:Spring 循环依赖的真相|得物技术

什么是 Bean 循环依赖?循环依赖:说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用,主要有如下几种情况。第一种情况:自己依赖自己的直接依赖第二种情况:两个对象之间的直接依赖前面两种情况的直接循环依赖比较直观,非常好识别,但是第三种间接循环依赖的情况有时候因为业务代码调用层级很深,不容易识别出来。循环依赖场景@Service@Service结果:项目启动失败抛出异常 BeanCurrentlyInCreationException。

ascagagasg的博客 2333

失败的一次客户现场软件实施经历总结

续接上篇:草根程序员转型做项目管理走过的点点滴滴之(十六、七)人团队2013年始于足下      经历了三个来月的忙碌工作,我们团队的问题,终于在这次客户现场实施过程中暴漏了出来。     2013年7月15日晚坐卧铺第二天(16日)到达DEF城市,直接来到客户现场做系统现场实施工作(称呼为A系统)。第一天倒还相对的平静,可后续的事情一件接一件,让我又一次经历了美妙的过程.....

anders lu 的专栏 4617

从一次启动失败深入剖析:Spring循环依赖的真相

什么是Bean循环依赖?循环依赖:说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用,主要有如下几种情况。第一种情况:自己依赖自己的直接依赖第二种情况:两个对象之间的直接依赖前面两种情况的直接循环依赖比较直观,非常好识别,但是第三种间接循环依赖的情况有时候因为业务代码调用层级很深,不容易识别出来。循环依赖场景@Service@Service结果:项目启动失败抛出异常BeanCurrentlyInCreationException。

java_beautiful的博客 400

java spring注解维护,从一次工程启动失败谈谈 spring 注解

原标题:从一次工程启动失败谈谈 spring 注解 檀宝权Java 后端开发工程师,负责度假 App 后端和广告后端开发维护工作,熟悉 Tomcat,Spring,Mybatis,会点 Python,Lua。一、背景线上环境升级成 JDK8后, Tomcat 启动会经常失败,调整 JVM 的栈大小为 2M 后,失败频率大大降低,但是偶尔还是会失败。捕获启动异常日志,会看到下面异常信息(没找到附件上...

weixin_33242139的博客 175

记一次面试经历(本人菜的kj)

刚去之后,签到,做面试题,面试题目如下: 1、用二分法和递归查找这个数组中某个元素的位置。 2、用SQL语句表示阴影部分的面积。 3、准备一下你做过的项目,之后和面试官聊聊。 做完之后就是面试过程: 1、问了问在大学期间学了那些课程? 2、才问了你自己做的那些项目,然后当时脑子抽了一样的说我的简历上的项目,这样回答显然不合适。 3、就问了一下spring的aop是啥? 4、问了sp...

shi201619616的博客 355
上一篇: 三种获得自动生成主键的方法,getGeneratedKeys,专用SQL和可更新的结果集
下一篇: 并发事务中的数据锁的例子
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值