java 多线程问题

Java-我去 2016-04-23 11:09:48
代码如下

import java.util.Hashtable;
import java.util.Map;

public class HashtableTest {

private static Map<Integer,Integer> hashtable= new Hashtable<Integer,Integer>();
public static void main(String[] args) {
while(true){
synchronized (hashtable) {
for (int i = 0; i < 10; i++) {
hashtable.put(i, i);
}
}
Thread removeThread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (hashtable) {
for (int i = 0; i < hashtable.size(); i++) {
hashtable.remove(i);
}
}
}
});

Thread getThread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (hashtable) {
for (int i = 0; i < hashtable.size(); i++) {
System.out.println((hashtable.get(i)));
}
}
}
});
removeThread.start();
getThread.start();
}
}
}

问题
hashtable 本身是线程安全的,而且在不安全的对方都加了synchronized,为什么执行的时候还会 是出现null (get())
...全文
140 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Java-我去 2016-04-23
  • 打赏
  • 举报
回复
引用 1 楼 scmod 的回复:
这个好像是因为你用的hashtable.size().... 每次循环完就会-1,最后实际上你只是remove了5次...就是只有0~4被remove了 removeThread.start() getThread.start() 然后就是这俩线程谁先运行了,如果put完运行的get,那就正常 如果是remove,那hashtable在remove完后剩下的key是5~9,所以get的key为0~4拿出来都是null
不对 问题已经知道了删除哪儿用的方法不对应该是
Iterator it = hashtable.entrySet().iterator();
					   while (it.hasNext()) {
						   Map.Entry<Integer, Integer> entry=(Entry<Integer, Integer>) it.next();  
			               System.out.println("delete this: "+entry.getKey()+"==="+entry.getValue());  
				            it.remove(); 
					    } 
				   }
zhuangqingch 2016-04-23
  • 打赏
  • 举报
回复
楼上正解,已经不是并发问题了,程序本身逻辑上的问题
scmod 2016-04-23
  • 打赏
  • 举报
回复
这个好像是因为你用的hashtable.size().... 每次循环完就会-1,最后实际上你只是remove了5次...就是只有0~4被remove了 removeThread.start() getThread.start() 然后就是这俩线程谁先运行了,如果put完运行的get,那就正常 如果是remove,那hashtable在remove完后剩下的key是5~9,所以get的key为0~4拿出来都是null

62,628

社区成员

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

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