解决方案 »

  1.   

    有点不理解了,我定义list大小时才会运行正常,这个是什么原因
      

  2.   

    线程不安全,直观的改进就是“list.add(i);”加锁
      

  3.   

    谢谢 是你给了我想法,我的猜想是其中一个线程在添加元素时定义了list的大小并且list容器已经填满,此时另外一个进程也对list元素执行添加操作导致下标越界的异常。
    解决办法:对add方法加类锁或者用Collections.synchronizedList,或者直接用Vector
    list内部实现就是数组,当我们在new一个ArrayList时其实就new了一个数组其大小也是定义好的,在jdk1.5ArryList的大小是10,所以110已经很大了。
      

  4.   

    public class ContainerSyn implements Runnable {
    private Object obj;
    static List<Integer> list = new ArrayList<Integer>(); ContainerSyn(Object obj) {
    this.obj = obj;
    } public static void main(String[] args) throws InterruptedException {
    Object obj = new Object();
    Thread t1 = new Thread(new ContainerSyn(obj), "Thread1");
    Thread t2 = new Thread(new ContainerSyn(obj), "Thread2");
    Thread t3 = new Thread(new ContainerSyn(obj), "Thread3");
    t1.start();
    t2.start();
    t3.start();
    t1.join();
    t2.join();
    t3.join();
    System.out.println("list size is " + list.size());
    } @Override
    public void run() {
    for (int i = 0; i < 110; i++) {
    synchronized (obj) {
    list.add(i);
    }
    }
    }
    }