`
jindw
  • 浏览: 501401 次
  • 性别: 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,一个被堵住了,另外一个还是在那边等待锁吧?

相关推荐

    FTP远程文件同步更新程序

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

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

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

    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存在命令执行漏洞(漏洞名称相同...

    测试培训教材

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

    Discuz! X1.5.1 繁体BIG5 R20111221.zip

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

    Discuz! X1.5.1 简体GBK R20111221.zip

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

    Discuz! X1.5.1 繁体UTF8 R20111221.zip

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

    Discuz! X1.5.1 简体UTF-8 R20111221.zip

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

    Erphpdown插件 WordPress收费下载/收费查看隐藏内容/在线充值/前端个人中心/用户推广提现

    一次购买,永久下载 colorbox灯箱弹窗特效 前端个人中心(可直接充值、查看消费等) 更新记录: 修复bug,下载地址可设置网盘名称以及提取码 (v9.2.4 2018.05.28) 修复bug,下载页面显示资源标题 (v9.2.3 2018.05...

    海康威视4004驱动级软件

    2、更正了只有第一次侦测有预录像的Bug 5.0.1.0 1.增加了发送短消息功能; 2.修改了底色为黑色; 3.修改了移动侦测功能; 4.修改了overlay的显示; 5.修改了多路报警全屏双击花屏的bug; 6.修改了预录像时,确保...

    手机 pdf 阅读器

    每一次打开UMD时,如果存在UMD书签,则自动导入,为了节约内存,如果超过150个书签,打死都不加了,而且,也不允许用户自己添加(此规则对所有的历史同样有效,即一个历史中,不能保存超过150个书签) 阅读时,具有...

    KODExplorer 芒果云-资源管理器

    - backspace后退截获浏览器事件,作为后退前一次访问的文件夹; - 搜索首字母不匹配问题 - 弹出层中的弹出层关闭,父窗口失去焦点问题。 - 代码中grunt部分代码拆分开,放到程序外面;提交到git、osc - 桌面:...

    月儿猫猫ASP生成HTML全站静态客户体验专业版.rar

    1.您是第一次使用月儿猫猫程序,请进入后台登陆页面并选择“静态HTML生成”菜单项,开始生成HTML页面,使您浏览没有数据资料的整站能正常,并激活静态页面的同步更新功能...默认用户名和密码都是:moonlightcat.cn ...

    好笔头 v4.0.8官方版.zip

    好笔头为国内第一款销售云笔记,是一款简单好用的团队备忘协作工具。工作内容、公司成员、客户信息、日常报告、事件提醒、知识案例等都可以记录到好笔头里,还可以直接在软件里发送邮件短信、评论下级工作、添加图片...

    邦仁电话订餐软件(快餐管理系统)

    8.系统提醒设置 可设是否提醒,多少时间提醒一次 9.工作模式设置 单机版本和网络版本合二为一, 购买一套在一台电脑上运行就是单机版本,购买多套在多台电脑运行,简单的设置一下就可以实现数据共享,联成网络版本 10...

    蚂蚁分类信息系统mymps4.0i商业源码破解版

    本程序完美破解一切限制,无限制建站,一次下载终身使用,无功能限制。是真正的破解无限制版,不是某某论坛发布的假破解垃圾版。功能超级强大。切后台操作简单,适合建地方性门户分类信息网站。 注意:这款是单城市...

    五指CMS v2.01简体中文GBK.zip

    1、全站统一模型,方便二次开发; 2、独创共享模型,独立模型,大小数据全部按需存储; 3、支持10多种不同类型的字段添加:如,文本字段,超级字段,地图字段,滑动条字段,组图字段,下载字段,URL加密字段等。 ...

    Speed Dial-crx插件

    2.0更新: 添加排除CSDN并记录选择,修复第一次使用dialog可能无法关闭的情况 1.9更新: 使用chrome搜索书签,可以配置部分颜色了 1.8更新:添加搜索选项,选择是否去掉知乎,修复搜索书签的bug。 1.7更新:搜索是...

Global site tag (gtag.js) - Google Analytics