Java 了解数组列表的线程安全性

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

我试图通过一个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)

我知道异常是由线程引起的。但是,我无法更全面地了解它的实际运行情况。非常感谢您的帮助。

查看ArrayList。添加代码。
数组列表基于数组。如果数组已满-arrayList将其长度扩展为2。要展开数组,必须复制它。当在一个线程中调用“add”扩展arrya并尝试复制数据时,您的代码似乎崩溃了,但另一个线程更改了引用。

此异常不是由线程引起的,正如
java.lang.ArrayIndexOutOfBoundsException所明确指出的那样,这是由于您的数组越界造成的。异常:2
可能重复您是如何提出这个程序的,以及您认为它究竟是如何演示线程安全与非线程安全的?@redFIVE,从技术上讲,java中发生的一切都是“由线程引起的”我想你的意思是,异常的原因与ArrayList被多个线程共享的事实无关。@jameslarge当然,这与此有关。
ArrayList
上使用的唯一函数是
add
,在正常情况下(其中“normal”表示单线程),该函数不应抛出一个界外。Close,但不能使用circhip(尽管不能进行下一票,因为除了猜测和因子之外的所有内容都是正确的)。交错
add
和更改引用不会造成任何伤害,因为
add
将完全在旧对象上执行。这与2个
add
方法交错有关。发现他们是如何做到这一点其实并不简单,我鼓励您尝试并发现它(提示-它在
grow
方法中)。