本帖最后由 backthought 于 2012-12-10 15:09:31 编辑

解决方案 »

  1.   

    这里为什么要交给10个线程来处理list里面的内容呢
      

  2.   

    使用这个CopyOnWriteArrayList安全类,或者自己封装下ArrayList。另外很好奇你为什么会闭锁。(有特殊业务需要?)
      

  3.   

    在修改的代码中对List进行同步(加排它锁),或者使用CopyOnWriteArrayList。
      

  4.   

    问题是你这个list.set(1,"xxxxx")的1是怎么来的,如果是需要根据判断来确定的话那么就很有可能出现的结果不是你想要的。如果index都是不一样的,那么就不会有问题了。因为你每个线程改变的都是不同的索引的值
      

  5.   

    我改了一下,可以确保list是最后修改的内容,但是无法确保list最后的值。代码如下:
    private static ArrayList<String> list = new ArrayList<String>(1);
    static {
    list.add("1");
    } public static void main(String[] args) throws Exception { final CountDownLatch latch = new CountDownLatch(10);
    final Lock lock = new ReentrantLock();

    for(int i=0;i<10;i++){
    new Thread(){
    public void run(){
    try {
    lock.lock();
    list.set(0, this.getName());
    System.out.println(list);
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    latch.countDown();
    lock.unlock();
    }
    }
    }.start();
    }
    //其他10个子线程用list.set(1,"xxxxx")这种方法修改list里的内容然后countdown
    //这里等待子线程修改后打出list里面的内容
    //请问这里能保证是最后修改后的list吗?
    //list是否需要同步或用Vector才能保证?
    latch.await();
    System.out.println("last---"+list);