请教一下线程相关问题

JevonsNotes 2017-01-11 04:10:51
下面这段代码运行,时而正常时而报错,是什么原因?
public class ThreadScopeShareData {
// private static int data = 0;
private static Map<Thread, Integer> threadData = new HashMap<Thread,Integer>();
public static void main(String[] args) {
for(int i =0;i<2;i++){
new Thread(new Runnable() {
@Override
public void run() {

int data = new Random().nextInt();
threadData.put(Thread.currentThread(), data);
System.out.println(Thread.currentThread().getName()
+ " has put data : " + data);
new A().get();
new B().get();
}
}).start();
}
}

static class A {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println(" A from " + Thread.currentThread().getName()
+ " get data : " + data);
}
}

static class B {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println(" B from " + Thread.currentThread().getName()
+ " get data : " + data);
}
}
}


下面是报错的一种情况:
Thread-0 has put data : 17163974
Thread-1 has put data : 1317343157
A from Thread-0 get data : 17163974

Exception in thread "Thread-1" java.lang.NullPointerException
at Thread.ThreadScopeShareData$A.get(ThreadScopeShareData.java:29)
at Thread.ThreadScopeShareData$1.run(ThreadScopeShareData.java:20)
at java.lang.Thread.run(Thread.java:744)

B from Thread-0 get data : 17163974


空指针异常?结果中的
Thread-0 has put data : 17163974
Thread-1 has put data : 1317343157

不是说明threadData.put(Thread.currentThread(), data);成功执行了吗,为何map会出现空指针?
ps:上述情况运气不好的话需要执行多几次。

...全文
256 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiazai973810200 2017-01-14
  • 打赏
  • 举报
回复
hashMap不安全,两个线程同时put并不一定都插入进去,很有可能只插入一个。此时,get()会返回null,再赋值给data,data类型为int,赋值null会报异常。
JevonsNotes 2017-01-13
  • 打赏
  • 举报
回复
引用 5 楼 chen956 的回复:
可以看看这篇文章:http://major57.blog.163.com/blog/static/1745483032012106102753704/,讲的挺清晰
正解,文章源码有点旧了,不过大体原理还是差不多的
insping 2017-01-13
  • 打赏
  • 举报
回复
int data = null 就会抛出java.lang.NullPointerException 异常.
insping 2017-01-13
  • 打赏
  • 举报
回复
线程安全是主要的原因:在没有put进去的时候get会返回null.
lsj231203 2017-01-12
  • 打赏
  • 举报
回复
应该是出现线程安全问题了! 可以加锁解决
清泉流 2017-01-12
  • 打赏
  • 举报
回复
可以看看这篇文章:http://major57.blog.163.com/blog/static/1745483032012106102753704/,讲的挺清晰
逗泥丸的平方 2017-01-12
  • 打赏
  • 举报
回复
引用 3 楼 chen956 的回复:
这个map是两个线程共享的,put方法也不是原子操作。对于这种情况需要对map加锁或者像楼上所说直接使用ConcurrentHashMap。
和put有什么关系?
清泉流 2017-01-12
  • 打赏
  • 举报
回复
这个map是两个线程共享的,put方法也不是原子操作。对于这种情况需要对map加锁或者像楼上所说直接使用ConcurrentHashMap。
双子叶 2017-01-12
  • 打赏
  • 举报
回复
private static Map<Thread, Integer> threadData = new HashMap<Thread,Integer>()换成 private static Map<Thread, Integer> threadData = new ConcurrentHashMap<Thread,Integer>()
ttkforit 2017-01-12
  • 打赏
  • 举报
回复
换成这个试试 private static Map<Thread, Integer> threadData = Collections.synchronizedMap(new HashMap<Thread, Integer>()); 多线程并发问题

62,612

社区成员

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

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