用Vector,Vector本身就是线程安全的...
如果非用Arraylist.那就用那个同步语句呀.呵呵,怎么拼我忘了 :)

解决方案 »

  1.   

    只读ArrayList的方法多线程调用没问题
    修改ArrayList的方法如果多线程要调用,就在该方法定义上加synchronized关键字,此为同步
      

  2.   

    java.util.Collections.synchronizedList(List list)
      

  3.   

    List list=new ArrayList();
    访问时
    synchronized(list){
      .........
    }
      

  4.   

    java.util.Collections.synchronizedList(List list)这个就行了,thinking in java中有说明的,看一下容器那一章。
      

  5.   

    用Vector代替ArrayList,Vector的方法是线程安全的,即synchronized的:)
      

  6.   

    别听那些劝你用Vector的。
    还是:Collections.synchronizedList(List list)
      

  7.   

    我喜欢用vector,但是推荐给别人的总应该是比较好的方法了,所以不推荐你用vector,请用上面讲的Collections.synchronizedList(List list)新老更替,毕竟arraylist比vector更加新一些
      

  8.   

    九九.如何选择容器
    97.如何选择List
    供选择的有 数组,ArrayList, LinkedList
    A.数组在顺序访问和随机访问速度比任何容器都要快
    B.ArrayList的随机访问要比LinkedList要快。
    C.理论上ArrayList的顺序访问要比LinkedList要快,但实际上并非如此。
    D.LinkedList的插入删除,特别是删除,比ArrayList要快的多的多。
    E.Vector的速度比不上ArrayList,它只是用来解决版本问题,所以不要使用它。小结List的最佳用法:
    A.如果元素的数量固定时,选用数组
    B.如果元素的数量不固定时,首先选用ArrayList;如果其中的插入删除操作很多引发性能问题时,考虑使用LinkedList。96.如何选用Set
    根据需要可以在TreeSet, HashSet , LinkedHashSet中选用一个。
    A.HashSet的各项性能均比TreeSet要好,但TreeSet的好处是可以按插入顺序保存元素。
    B.LinkedHashSet与HashSet的比较:
      a.LinkedHashSet的插入比HashSet要慢,因为它有维护链表的代价。
      b.LinkedHashSet的遍历比HashSet要快。95.如何挑选Map
    根据需要可以在TreeMap, HashMap , LinkedHashMap , IdentityHashMap ,WeakHashMap,HashTable中选用一个。A.HashMap只比HashTable快一点,但HashMap是用来替代HashTable的。
    B. 选择Map的时候首先选用HashMap ,只有在用恒定有序的Map时,才使用HashMap .
      (TreeMap比HashMap要慢,但它是用来创建有序列表的,所以使用它时用不着为它排序,就能直接进行查询了。)
    C.LinkedHashMap比HashMap稍慢,它要维护链表。
    D.IdentityHashMap,无法与上述Map作比较,因为它用==而不是equals来比较对象的相等性。
      

  9.   

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;List aArrayList = Collections.synchronizedList(new ArrayList());
    这样创建的ArrayList实例是synchronized的
    还是用Vector吧
      

  10.   

    在这里有很多同学忽略了我们到底要synchronize什么,事实上,在实践运用中,像Vector/HashTable这样的底层的synchronization并没有太大意义,楼上用了Collections的synchronizedList函数,意义和底层synchronization是一样的,但是,实践中往往有如下的要求:
    if (!listData.contains(objData))
       listData.put(objData);
    someone might argue that we can use Set here instead of List. 我知道,我只是举一个例子,像这种情况,懂线程的人都知道在判断之后,另一个线程可能会加入同一instance的objData,这样这个判断就不是很完全了。
    做法是,
    synchronized (listData)
    {
      if (!listData.contains(objData))
        listData.put(objData);
    }
    事实上,很高的楼上的yanghx2000(info)已经提过了,但是号召他的人应该是没有,但是它的做法却是最正确的,这也是sun为什么放弃Vector/HashTable的原因,第一,没有太大的意义;第二,每次都要request/release lock,运行太慢。
      

  11.   

    同意楼上!
    但是Vector也是可以的,看你的应用对性能的要求吧!
      

  12.   

    不要随便用vector,效率低得很,他对每个方法都进行同步,实际上几乎是不需要的,
    Collections.synchronizedList(List list)应该是最佳选择
      

  13.   

    加synchronized关键字 在线程方法使用前!
      

  14.   

    说什么呢?性能差别也不是关键。
    SynchronizedList中的那一堆synchronized(mutex)是白锁的啊。
    不用Vector最重要的原因俺认为是为了保证代码更高的兼容性。
      

  15.   

    Collections.synchronizedList(List list)不要用vector