【发布时间】:2016-04-13 14:14:27
【问题描述】:
我试图通过 java 程序了解 ArrayList 如何不是线程安全的。附加的是我的程序。
import java.util.ArrayList;
import java.util.List;
public class class1
{
static List ar=new ArrayList(1);
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, InterruptedException
{
Thread t1= new Thread()
{
public void run()
{
while(true)
{
ar.add(new Object());
}
}
};
Thread t2=new Thread()
{
public void run()
{
while(true)
{
ar=new ArrayList(1);
ar.add(new Object());
ar.add(new Object());
}
}
};
t1.start();
Thread.sleep(100);
t2.start();
}
}
我得到的错误是:
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 2
at java.util.ArrayList.add(Unknown Source)
at class1$1.run(class1.java:22)
我知道异常是由线程引起的。但是,我没有更全面地了解它的实际运作方式。非常感谢任何帮助。
【问题讨论】:
-
此异常不是由线程引起的,而是由
java.lang.ArrayIndexOutOfBoundsException: 2明确指出的数组超出范围引起的 -
你是怎么想出这个程序的,你认为它究竟如何证明线程安全与非线程安全?
-
@redFIVE,从技术上讲,Java 中发生的一切都是“由线程引起的”。我认为您的意思是,异常的原因与 ArrayList 由多个线程共享>这一事实无关。
-
@jameslarge 当然,这与它有关。
ArrayList上使用的唯一函数是add,在正常情况下(“正常”表示单线程)不应抛出越界。
标签: java multithreading arraylist collections