`
jindw
  • 浏览: 508944 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

一次同步不当的bug记录。

    博客分类:
  • Java
阅读更多
昨天晚上,收到QA报告,说页面里面一大堆数据无法显示。
别急,别急,先保护现场,用另外一台服务器在调试模式下继续测试,想办法复现这个问题。

到了晚上,问题终于又出现了。打开远程调试,检查一下运行线程,发现有一大堆用于抓取外部数据的Servlet线程不动了。
原来,一条记录指向了一个公司内部ip地址,员工下班关机之后,无法获取该记录,导致装载延迟。
而我们的开发人员在这里为了避免同一资源的多次解析,用了一个全局的同步锁,一下子其他数据也无法装载。

问题代码:
    Object data = getFromCache...;
    if (data != null) {
      return data;
    }
    synchronized (LOCK) {
        Object data =getFromCache...;
        if (data != null) {
           return data;
        }
        data = buildData..
        saveToCache...
        return data
    }


上面的代码看似还行,可是,确保了我们不会重复解析同一数据,但是,加锁加的不合适,一旦任何一个资源延迟,都将导致全部线程暂停。

给一下修改后的形式:
	private Map lockMap = new HashMap();
.....
	protected String getCachedResource(String url) throws Exception {
		String key =  url;
		Object data = getFromCache(key);
		if (data == null) {
			//获取资源对应的锁
			Object lock = requireLock(url);
			synchronized (lock) {
				data = parser.parse(url);
				saveToCache(key, data);
			}
			//删除锁
			lockMap.remove(key);
		}
		return (String) data;
	}

	private Object requireLock(Object key) {
		synchronized (lockMap) {
			Object lock = lockMap.get(key);
			if (lock == null) {
				lock = new Object();
				lockMap.put(key, lock);
			}
			return lock;
		}
	}

仍外抱怨一下繁琐的代码风格
一个内部类,构造函数最多带n个参数,能后呢,某些人为了可能的使用方便,居然给配上了2的n次方个构造函数。晕啊,我真不想看你这么多的文档:(
分享到:
评论
8 楼 jindw 2009-02-26  
sdh5724 写道
代码写的够烂的, 难道不会使用同步队列, 自己加个LOCK, 麻烦死了。


能否详细一点呢?
我比较笨,呵呵
7 楼 jindw 2009-02-26  
case0079 写道
异常呢??
getFromCache不会抛出异常吗?

synchronized里面抛出异常会释放锁的


呵呵,我还真吧这个给忘了,低级错误^_^
谢谢谢谢。
6 楼 kakaluyi 2009-02-26  
为什么会导致装载延迟,如果url不存在的话,是不是用url直接返回null,或者马上抛出异常。是不是用到了URLConnection包,那为什么不把超时时间设置短一点
5 楼 case0079 2009-02-26  
异常呢??
getFromCache不会抛出异常吗?

synchronized里面抛出异常会释放锁的
4 楼 sdh5724 2009-02-25  
代码写的够烂的, 难道不会使用同步队列, 自己加个LOCK, 麻烦死了。
3 楼 QuakeWang 2009-02-25  
jindw 写道
恩,这个是的,但是如果这个url有问题,抓不下来,我们再开100个线程估计也是没用的了。
我只是解决了一个url有问题导致其他url死锁的bug。

QW有其他办法吗?

没有想到好办法,不过parser.parse(url)这个方法里面没有处理超时吗?如果有超时设定的话,就不会一直堵了。
2 楼 jindw 2009-02-25  
恩,这个是的,但是如果这个url有问题,抓不下来,我们再开100个线程估计也是没用的了。
我只是解决了一个url有问题导致其他url死锁的bug。

QW有其他办法吗?
1 楼 QuakeWang 2009-02-25  
感觉没有解决问题:2个线程如果同时请求相同的url,一个被堵住了,另外一个还是在那边等待锁吧?

相关推荐

    测试BUG流程管理规范

    - 示例:第一次修改是因为代码逻辑错误导致,第二次是因为数据库连接配置不当,第三次是因为前端界面未同步更新等问题。 **3. BUG解决优先级** - 开发人员根据BUG的优先级来调整自己的工作计划。 - **重要且紧急*...

    TestLink1.8.5_BugFree2.1集成.rar

    3. **双向同步**:不仅测试结果可以从TestLink推送到BugFree,也可以从BugFree更新的缺陷状态反向同步到TestLink,确保信息的一致性。 4. **统一的工作流程**:集成后的系统提供了一致的用户体验,用户可以在同一...

    ARCGIS PRO官网发布的bug修改记录

    ### ARCGIS PRO官网发布的bug修改记录 #### 概述 ArcGIS Pro是Esri公司开发的一款高级地理信息系统软件,广泛应用于地图制作、空间数据分析、地理处理等多个领域。随着技术的发展与用户需求的增长,ArcGIS Pro不断...

    FTP远程文件同步更新程序

    第一次运行本程序之后,请先进入参数设置界面设置相关传输参数。 4.由于本程序建立在FTP传输协议的基础上运作,没有FTP服务器的用户可以通过使用FTP服务器 架构软件轻松架构FTP服务器,从而达到使用本程序自动定时...

    Java Bug 模式详解

    Java Bug模式详解是一种深入理解和解决Java编程中常见错误和陷阱的方法。这些模式通常源于语言特性、API使用不当或对编程规范的误解。本篇将详细探讨一些常见的Java Bug模式,并提供预防和修复策略。 1. **空指针...

    PyPI 官网下载 | lyrebird-bugit-1.8.2.tar.gz

    2. **版本控制集成**:与Git等版本控制系统集成,使得每一次bug修复都能与代码更改同步,便于回溯和协作。 3. **API接口**:提供API接口,让开发者能够轻松地将Bugit集成到自己的项目中,实现自动化报告和处理bug。 ...

    最新亲测可用时间同步工具.rar

    时间同步有助于纠正由于硬件老化、操作系统bug或者网络延迟导致的时钟漂移,确保所有系统在同一时间轴上运行。 NTP是一种用于同步网络中多个计算机时钟的协议,它通过交换时间戳信息来实现。NTP的工作机制是:...

    《程序人生》记一次敖丙的线上P2事故1

    "《程序人生》记一次敖丙的线上P2事故1" knowledge points: 1. 程序 BUG 的处理:文章中提到 P2 级别的 BUG,是指系统中出现的严重错误,需要立即修复,以避免更大的损失。 2. 线上事故处理:文章中提到线上事故...

    bugreport-2024-06-03-125428.zip

    通过对这些文件的分析,我们可以推断这是一次涉及多个MIUI系统组件和应用的故障排查过程。开发团队会通过这些日志来定位导致错误的具体代码行、系统状态、异常堆栈等信息,以便修复软件bug并优化用户体验。每个日志...

    记一次MySQL Slave库恢复实战记录

    本文所涉及的是一次实际的从库恢复案例,为读者提供了对常见故障处理的实战经验。 案例中提到的从库恢复问题涉及到以下几个关键点: 1. 复制延迟与错误日志分析:当从库的复制出现故障时,首先应该查看从库的状态...

    东方标准网络营销内部SEO记录系统 v2.0.zip

    关键字排名检查主要是检查自己网站和竞争网站在同一关键字的排名情况对比,以及自己网站关键字和上一次检查排名升降对比,可批量检查。关键字由添加按钮添加、关键字生成批量选择添加,也可以通过网站后台发布文档...

    C_Flask_5.23_聂磊_会议记录1

    - 周二下午5点前,第一次评审的评审组需要确认被评审组是否按照建议进行了修改,确保了反馈的及时处理。 - 周四中午12点前,被评测组需要提供软件评审报告和软件问题报告,以便F组(李坤浩、张竹君、张文斌)和G组...

    高并发下如何避免产生重复数据?.doc

    1. 确保业务逻辑中的幂等性:每个请求执行一次且仅执行一次,即使重复请求也不会产生额外影响。 2. 使用消息队列进行异步处理,但需要控制并发度,如设置单线程顺序消费。 3. 在数据库层面利用唯一索引或者乐观锁来...

    ZenTaoPMS.12.5.2.win64.zip

    一、修改记录 修复的Bug 3744 搜索需求后报错 3740 回收站中删除的构建任务对象类型和对象名称未正确显示 3737 CNVD-C-2020-287511 CNVD-C-2020-286783 CNVD-C-2020-286963 禅道CMS存在命令执行漏洞(漏洞名称相同...

    ZenTaoPMS.12.5.2.win32.zip

    一、修改记录 修复的Bug 3744 搜索需求后报错 3740 回收站中删除的构建任务对象类型和对象名称未正确显示 3737 CNVD-C-2020-287511 CNVD-C-2020-286783 CNVD-C-2020-286963 禅道CMS存在命令执行漏洞(漏洞名称相同...

    测试培训教材

    一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的工作成果又由谁来度量呢?度量的标准和依据是什么呢?软件测试的度量是测试管理必须仔细思考的问题。...

    项目经理如何打造高效的技术团队?.docx

    TDD和BDD强调先写测试,再写实现,有助于减少回归错误,但不必强迫一次性覆盖所有测试用例。 4. **使用可靠的Bug跟踪工具**:记录和管理Bug可以确保问题得到及时处理,避免重复工作。一个好的Bug跟踪工具应能详细...

    Discuz! X1.5.1 简体GBK R20111221.zip

    FIX 修正删除留言评论时没有删除审核记录的BUG FIX 修复在显示子版块时,子版块域名没有被替换的BUG FIX DIY图文模块上传的图片不会被获取图片替代的问题 ADD 增加相册分类选择 FIX 门户附件无法删除 FIX 无法...

    Discuz! X1.5.1 繁体BIG5 R20111221.zip

    FIX 修正删除留言评论时没有删除审核记录的BUG FIX 修复在显示子版块时,子版块域名没有被替换的BUG FIX DIY图文模块上传的图片不会被获取图片替代的问题 ADD 增加相册分类选择 FIX 门户附件无法删除 FIX 无法...

Global site tag (gtag.js) - Google Analytics