HashMap是线程不安全的实例与说明

qq_26754943 2015-08-06 09:41:51
API说明:(The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls)

/*
* 2015/8/6 : 不刻意为自己寻找存在感
* 目的:初步了解线程范围内共享变量的概念
* 有点问题:
* 有时会输出Null
* 问题的原因:
* 可能HashMap线程不安全导致的
*
*/
public class ShareData1 {
//static int data = 0;
static Map<Thread,Integer> map = new HashMap<Thread,Integer>();
public static void main(String[] args) {

for(int i=0;i<2;i++){
new Thread(){
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+":"+data);
map.put(Thread.currentThread(), data);
/* map.put(Thread.currentThread(), data);
System.out.println(Thread.currentThread().getName()+":"+data);*/

new A().getDataA();
new B().getDataB();
};
}.start();
}
}
static class A{
void getDataA(){
System.out.println(Thread.currentThread().getName()+"A:"+map.get(Thread.currentThread()));
}}
static class B{
void getDataB(){
System.out.println(Thread.currentThread().getName()+"B:"+map.get(Thread.currentThread()));
}}
}

/*错误的结果:
Thread-1:-236229789
Thread-0:-934142735
Thread-1A:null
Thread-0A:-934142735
Thread-1B:null
Thread-0B:-934142735
=====================
Thread-0:-1331897743
Thread-1:-1239048981
Thread-1A:-1239048981
Thread-0A:null
Thread-1B:-1239048981
Thread-0B:null
====================
Thread-0:-1192204428
Thread-1:-439715298
Thread-0A:null
Thread-1A:-439715298
Thread-0B:null
Thread-1B:-439715298
******************************************************
正确的结果
Thread-0:1109365405
Thread-1:969714427
Thread-0A:1109365405
Thread-1A:969714427
Thread-0B:1109365405
Thread-1B:969714427
===================
Thread-1:1936099369
Thread-0:-616837039
Thread-0A:-616837039
Thread-1A:1936099369
Thread-0B:-616837039
Thread-1B:1936099369
*/
...全文
699 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程小强 2015-08-10
  • 打赏
  • 举报
回复
我觉得让两个线程多跑一下,然后让它抛出异常就很明了了
metallica-run 2015-08-09
  • 打赏
  • 举报
回复
按照楼主注释掉的方式运行,基本上不会出现错误(理论上应该会,不过测试了好多次并没出现).System打印出来需要一定时间,而这个时候B线程也同时执到put方法,导致了数据丢失.
sxiaobei 2015-08-09
  • 打赏
  • 举报
回复
楼上现在HashTable效率比较低,写入读取的时候会对整个散列表加锁,一般都会从concurrentHashMap是分段加锁的,效率要比 HashTable效率高的多。
rumlee 2015-08-07
  • 打赏
  • 举报
回复
HashMap本来就不是线程安全的,而且你这个问题应该就是非线程安全导致的。你可以换成Hashtable试试效果看看。

62,634

社区成员

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

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