Java 了解数组列表的线程安全性
我试图通过一个java程序来理解ArrayList如何不是线程安全的Java 了解数组列表的线程安全性,java,multithreading,arraylist,collections,Java,Multithreading,Arraylist,Collections,我试图通过一个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, Cla
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)
我知道异常是由线程引起的。但是,我无法更全面地了解它的实际运行情况。非常感谢您的帮助。查看ArrayList。添加代码。
数组列表基于数组。如果数组已满-arrayList将其长度扩展为2。要展开数组,必须复制它。当在一个线程中调用“add”扩展arrya并尝试复制数据时,您的代码似乎崩溃了,但另一个线程更改了引用。此异常不是由线程引起的,正如
java.lang.ArrayIndexOutOfBoundsException所明确指出的那样,这是由于您的数组越界造成的。异常:2
可能重复您是如何提出这个程序的,以及您认为它究竟是如何演示线程安全与非线程安全的?@redFIVE,从技术上讲,java中发生的一切都是“由线程引起的”我想你的意思是,异常的原因与ArrayList被多个线程共享的事实无关。@jameslarge当然,这与此有关。ArrayList
上使用的唯一函数是add
,在正常情况下(其中“normal”表示单线程),该函数不应抛出一个界外。Close,但不能使用circhip(尽管不能进行下一票,因为除了猜测和因子之外的所有内容都是正确的)。交错add
和更改引用不会造成任何伤害,因为add
将完全在旧对象上执行。这与2个add
方法交错有关。发现他们是如何做到这一点其实并不简单,我鼓励您尝试并发现它(提示-它在grow
方法中)。