java - 如何通过测试证明 arraylist 不是线程安全的?

标签 java arraylist thread-safety

在我们的应用程序中,我们在 ArrayList.add(Object o) 操作中遇到了 ArrayIndexOutOfBounds 异常。最明显的解释是线程安全,但我无法重新创建事件。我试过创建两个线程。在一个中我添加元素,在另一个中我删除它们(或清除数组),但我第二次没有得到异常。 我的意思是很明显它可以通过查看 ArrayList 的源代码来实现,但是能够演示它会很好。

我已经运行这个测试很长一段时间了,没有任何异常:

public class Test {
static ArrayList a = new ArrayList();

public static void main(String[] args) throws Exception {
    Thread t1 = new Thread() {
        public void run() {
            while (true) {
                if (a.size() > 0)
                    a.remove(0);
            }
        }
    };

    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                a.add(new Object());
            }
        }
    };

    t2.start();
    Thread.sleep(100);
    t1.start();
}
}

最佳答案

感谢 isnot2bad 的评论,我发现我的假设存在问题。 问题在于并发添加,而不是添加/删除。 我能够创建一个失败的测试:

static ArrayList a = new ArrayList(1);

public static void main(String[] args) throws Exception {
    Thread t1 = new Thread() {
        public void run() {
            while (true) {
                a.add(new Object());
            }
        }
    };

    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                a = new ArrayList(1);
                a.add(new Object());
                a.add(new Object());
            }
        }
    };

    t2.start();
    Thread.sleep(100);
    t1.start();
}

在第一个线程的添加行中,我得到了这个:

Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 2 

:)

关于java - 如何通过测试证明 arraylist 不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18983362/

相关文章:

java - MyBatis/Ibatis :- Help regarding query in Ibatis/Mybatis

java - 将 Java ArrayList 修剪为具有最新日期的不同行

java - 如何暂停正在运行的线程并在需要时重新启动同一线程?

java - 从 ThreadSafeClientConnManager 连接池取消/中止连接

java - 无法通过聚合所有模块来生成覆盖率报告

java - Java(android) 如何在另一个方法中使用一个方法的变量

java - Android:当我传递 Null 时,构造函数是不明确的,但当我传递分配给 Null 的变量时则不是

java - 在 Java/Android 中高效地过滤 ArrayList

clojure - Clojure 中的线程安全流行?

java - 将 Java 应用程序转换为 JApplet 以供在线访问