多线程问题的执行顺序

benluobo 2012-04-08 01:41:42
假设现在有一段代码如下:


if(map.containKey('a')){
update();
}else{
insert();
map.put('a','b');
}




在多线程的时候,是有可能在insert处,因为map中还没有a,造成多个线程都执行insert

现在用eclipse开始的时候,如果我采用断点, 是完全可以出现上面的情况,造成插入两条语句的。
但是不采用断点的时候,应该如何添加语句重现插入两条的情况呢?


我的解决方法是在insert后面加入Thread.sleep(10000) 但是好像还是不能重现上面的问题



...全文
177 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2012-04-09
  • 打赏
  • 举报
回复
如果需要在正式代码中加入sleep,那么就要考虑考虑是否设计合理了
龙四 2012-04-09
  • 打赏
  • 举报
回复
我说楼主啊,果断改用ConcurrentHashMap啊

直接是线程安全的,其并发性能优于使用同步的HashMap

	ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
if(map.containsKey("a")) {
//
} else {
map.putIfAbsent("a", "a");
}
dracularking 2012-04-09
  • 打赏
  • 举报
回复
你可以試著在if塊之前加入一條時間打印語句來查看是否會被至少執行兩次或兩次以上,還有時間間隔多少,就大概能知道當時的運行環境了。
MiceRice 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我先模拟2个insert的动作,应该是放在insert后面吧,然后才能2个线程都保证执行吧
[/Quote]

其实你要模拟的关键是:两个线程都进如else,所以:
}else{
System.out.println("in else.");
Thread.sleep(10000);
insert();
map.put('a','b');
}
应该是OK的。主要是不知道你的insert是否有对竞争访问做控制。
benluobo 2012-04-09
  • 打赏
  • 举报
回复
我先模拟2个insert的动作,应该是放在insert后面吧,然后才能2个线程都保证执行吧
MiceRice 2012-04-08
  • 打赏
  • 举报
回复
要看你外面是怎么调用的吧,如果线程是一起启动的,10秒肯定是够了的。

另外不知道insert()做了什么事情,建议sleep放在insert前面去。
benluobo 2012-04-08
  • 打赏
  • 举报
回复
自己顶一下 ,希望有高手可以解决
benluobo 2012-04-08
  • 打赏
  • 举报
回复
回3楼 处理方式我知道这样可以 , 我现在想的是怎么去重现该问题 , 主要是用来重现问题
yizhizouxiaqu 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

10秒还不够么? 肯定是够的 但是应该不是sleep的问题
[/Quote]
我不是说不够,可能是多也可能是少
MiceRice 2012-04-08
  • 打赏
  • 举报
回复
竞争资源多线程下,用同步块处理,类似这样:

synchronized (map) {
if(map.containKey('a')){
update();
}else{
insert();
map.put('a','b');
}
}
benluobo 2012-04-08
  • 打赏
  • 举报
回复
10秒还不够么? 肯定是够的 但是应该不是sleep的问题
yizhizouxiaqu 2012-04-08
  • 打赏
  • 举报
回复
sleep的时间换换看看可以不

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧