多线程问题的执行顺序

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) 但是好像还是不能重现上面的问题



...全文
188 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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的时间换换看看可以不
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在 Python 生态中,pip 和 conda 是常用的库管理与安装工具。但因网络状况,在国内直接连官方仓库常会速度慢甚至连不上。为改善此状况,可切换到国内镜像服务器,如清华 TUNA 的镜像服务,以下分别介绍 pip 和 conda 的配置方法。 对于 conda,首先它是一个含丰富 Python 包及环境管理功能的流行科学计算平台。要更换国内源,可去清华 TUNA 的镜像站下载安装包,其也提供了 Anaconda 仓库及第三方源镜像。在 Linux 或 Mac 系统,可在用户目录下创建或编辑 .condarc 文件,文件内容如下: Windows 用户因系统限制无法直接创建以 . 开头的文件名,可通过运行 conda config --set show_channel_urls yes 来生成 .condarc 文件,再按上述内容编辑。之后执行 conda clean -i 清除索引缓存,以确保使用镜像站索引。最后用 conda create -n myenv numpy 命令测试配置是否成功。 对于 pip,临时更换源可在 pip install 命令时加 -i 参数指定源,如 pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple 。永久更换源,Linux 系统在 ~/.pip/pip.conf(无则创建)中添加以下内容: Windows 和 Mac 用户分别在 %USERPROFILE%\pip\pip.ini(Windows)或 $HOME/Library/Application Support/pip/pip.conf(Mac)中进行相同配置。 通过上述步骤,能提高 pip 和 conda 在国内的安

62,635

社区成员

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

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