多线程问题的执行顺序
假设现在有一段代码如下:
if(map.containKey('a')){
update();
}else{
insert();
map.put('a','b');
}
在多线程的时候,是有可能在insert处,因为map中还没有a,造成多个线程都执行insert
现在用eclipse开始的时候,如果我采用断点, 是完全可以出现上面的情况,造成插入两条语句的。
但是不采用断点的时候,应该如何添加语句重现插入两条的情况呢?
我的解决方法是在insert后面加入Thread.sleep(10000) 但是好像还是不能重现上面的问题
--------------------编程问答-------------------- sleep的时间换换看看可以不 --------------------编程问答-------------------- 10秒还不够么? 肯定是够的 但是应该不是sleep的问题 --------------------编程问答-------------------- 竞争资源多线程下,用同步块处理,类似这样:
synchronized (map) {--------------------编程问答--------------------
if(map.containKey('a')){
update();
}else{
insert();
map.put('a','b');
}
}
我不是说不够,可能是多也可能是少 --------------------编程问答-------------------- 回3楼 处理方式我知道这样可以 , 我现在想的是怎么去重现该问题 , 主要是用来重现问题 --------------------编程问答-------------------- 自己顶一下 ,希望有高手可以解决 --------------------编程问答-------------------- 要看你外面是怎么调用的吧,如果线程是一起启动的,10秒肯定是够了的。
另外不知道insert()做了什么事情,建议sleep放在insert前面去。 --------------------编程问答-------------------- 我先模拟2个insert的动作,应该是放在insert后面吧,然后才能2个线程都保证执行吧
--------------------编程问答--------------------
其实你要模拟的关键是:两个线程都进如else,所以:
}else{
System.out.println("in else.");
Thread.sleep(10000);
insert();
map.put('a','b');
}
应该是OK的。主要是不知道你的insert是否有对竞争访问做控制。 --------------------编程问答-------------------- 你可以試著在if塊之前加入一條時間打印語句來查看是否會被至少執行兩次或兩次以上,還有時間間隔多少,就大概能知道當時的運行環境了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 我说楼主啊,果断改用ConcurrentHashMap啊
直接是线程安全的,其并发性能优于使用同步的HashMap
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();--------------------编程问答-------------------- 如果需要在正式代码中加入sleep,那么就要考虑考虑是否设计合理了
if(map.containsKey("a")) {
//
} else {
map.putIfAbsent("a", "a");
}
补充:Java , Java SE