黑马程序员技术交流社区

标题: 线程中map赋值的问题 [打印本页]

作者: WO.瘾姓埋銘    时间: 2014-5-11 03:46
标题: 线程中map赋值的问题
本帖最后由 WO.瘾姓埋銘 于 2014-5-11 10:13 编辑
  1. package threadTest;

  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Random;

  5. public class ThreadScopeShareData {
  6.                
  7.         private static Map<Thread, Integer> map = new HashMap<Thread, Integer>();
  8.         
  9.         public static void main(String[] args) {
  10.                
  11.                 //实现两个线程共享一个数据
  12.                 for(int i=0; i<2; i++) {
  13.                         new Thread(new Runnable(){
  14.                                 @Override
  15.                                 public void run() {
  16.                                         int data = new Random().nextInt();
  17.                                         System.out.println(Thread.currentThread().getName() + "get data :" + data);
  18.                                         map.put(Thread.currentThread(), data);
  19.                                         A.getData();
  20.                                         B.getData();
  21.                                 }
  22.                         }).start();
  23.                 }
  24.         }
  25.         
  26.         static class A {
  27.                 public static void getData() {
  28.                         System.out.println("A from " + Thread.currentThread().getName() + "get data :" + map.get(Thread.currentThread()));
  29.                 }
  30.         }
  31.         static class B {
  32.                 public static void getData() {
  33.                         System.out.println("B from " + Thread.currentThread().getName() + "get data :" + map.get(Thread.currentThread()));
  34.                 }
  35.         }
  36. }
复制代码

输出结果如下:
Thread-1get data :1474835009
Thread-0get data :521348174
A from Thread-1get data :null
A from Thread-0get data :521348174
B from Thread-1get data :null
B from Thread-0get data :521348174


在这个代码中赋值之后,在类A和类B中获得当前线程的值时有可能是null这是为什么!
作者: 最后的希冀    时间: 2014-5-11 09:12
本帖最后由 最后的希冀 于 2014-5-11 09:27 编辑

这个问题应该是出在HashMap上吧,查阅HashMap的API,上面这样写“HashMap实现是不同步的,如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。”这里两个线程可能会同时对Map集合进行操作,而增加元素操作会对Map的结构发生修改,所以会出现赋值不成功的现象吧,如果将这个赋值语句实现同步的话,应该就不会出现问题了吧。
还有,如果用Hashtable来实现的话,由于Hashtable中自动实现同步方法,应该就不会出现问题了。当然,我试了二十多次是没出问题。你也可以自己试一试。

作者: WO.瘾姓埋銘    时间: 2014-5-11 10:14
非常感谢,我用同步试了一下,没有再出现null.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2