第二帖:HashMap在并发下的ArrayIndexOutOfBoundsException异常原因

悠树 发布于 2017/01/23 12:39
阅读 364
收藏 2

第一帖:https://www.oschina.net/question/555043_2218248

第一个帖子我没有表达清楚,很多朋友没理解到我的意思,再开一个帖子说明下。

首先看这篇博文:https://my.oschina.net/xianggao/blog/393990

博文中详细分析了并发使用HashMap导致的两个问题的原因:

1. put非null元素后get出来的却是null。

2. 出现死循环。

运行那代码更常遇到的是ArrayIndexOutOfBoundsException异常,博文中并没有提到。

所以我提问的目的是想搞清楚并发使用HashMap导致ArrayIndexOutOfBoundsException异常的具体原因,像博文中那样的分析,而不是讨论哪个实现是线程安全的哪个不安全,该用哪一个之类的。

JDK版本:1.6

感谢各位解答的朋友。

 

以下为第一帖内容:

执行末尾的代码,有时会出现ArrayIndexOutOfBoundsException异常(下图),只有put和get操作,什么情况会出现这个异常?看源码没搞明白,求解。

public class TestLock {

    private HashMap map = new HashMap();

    public TestLock() {
        Thread t1 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(new Integer(i), i);
                }
                System.out.println("t1 over");
            }
        };

        Thread t2 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(new Integer(i), i);
                }

                System.out.println("t2 over");
            }
        };

        Thread t3 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(new Integer(i), i);
                }

                System.out.println("t3 over");
            }
        };

        Thread t4 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(new Integer(i), i);
                }

                System.out.println("t4 over");
            }
        };

        Thread t5 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(new Integer(i), i);
                }

                System.out.println("t5 over");
            }
        };

        Thread t6 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.get(new Integer(i));
                }

                System.out.println("t6 over");
            }
        };

        Thread t7 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.get(new Integer(i));
                }

                System.out.println("t7 over");
            }
        };

        Thread t8 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.get(new Integer(i));
                }

                System.out.println("t8 over");
            }
        };

        Thread t9 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.get(new Integer(i));
                }

                System.out.println("t9 over");
            }
        };

        Thread t10 = new Thread() {
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.get(new Integer(i));
                }

                System.out.println("t10 over");
            }
        };

        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();

        t6.start();
        t7.start();
        t8.start();
        t9.start();
        t10.start();
    }

    public static void main(String[] args) {
        new TestLock();
    }
}
加载中
0
000011
000011

自己看源码分析才是最好的

0
Alexdevlin
Alexdevlin

线程执行的随机性导致线程10执行的时候 map里并没有这个值

返回顶部
顶部