本帖最后由 beguile 于 2011-01-20 15:40:02 编辑

解决方案 »

  1.   

    是两个线程同时对一个ArrayList进行增加或删除,就可能抛异常。比如一个ArrayList里的内容被两个线程同时删除,两个线程有可能会想要删除同一个内容,一个线程先完成的时候第二个线程再删,就找不到这个内容了。
    需要进行线程相关的操作时就用Vector,不需要的时候就用ArrayList,因为异步的效率比较高。
      

  2.   

    那做ssh开发时,如何考虑线程问题呢?那些需要考虑多线程呢?IO操作文件,获得数据库连接?   
      

  3.   

    个人不建议使用Vector,不如使用synchronized做同步呢
      

  4.   


    真要实现集合类的同步而又不想synchronized块的话,java.util.concurrent 包里面有很多同步容器类,还有FIFO式的同步队列,Vector不推荐使用了。SSH大多是做Web开发的吧,本质上还是归结到Servlet类上,注意的是Servlet本身就是非线程安全的,因为每一个Servlet的请求都是同一个Servlet实例下多线程访问。Web开发时使用线程同步要什么谨慎的,因为线程同步会损耗较大的性能(加锁释放锁等),尤其是在高并发数的情况下。(这个我没有实战过的哈,一些想法而已。 ^_^)至于“数据库连接”这种大对象一般使用的是连接池或者对象池,甚至更大一点的对象或者十分重要的对象则使用单例的模式。
      

  5.   

    ArrayList线程不安全的例子如下public class ArrayListConcurrentProblem {
    public static void main(String[] args) {
    final List list = new ArrayList();
    // final List list = new Vector();
    for (int i=0; i<10000; i++){
    list.add(i);
    }
    for (int i=0; i<10; i++)
    new Thread(){
    @Override
    public void run(){
    for (int i=0; i<1000; i++)
    list.remove(0);
    }
    }.start();
    for (int i=0; i<10; i++)
    new Thread(){
    @Override
    public void run(){
    for (int i=0; i<1000; i++)
    list.add(10000*i + i);
    }
    }.start();
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {}
    System.out.println(list.size());
    }
    }上面这段代码,list中初始放了10000个元素,然后开了10个线程从list中移除共10000个元素,差不多同时开了10个线程往list中插入共10000个元素。
    如果是Vector,最后list中元素个数应该是10000,而用ArrayList的时候很可能得到非10000的结果。
      

  6.   

    你想用线程安全的集合内Java有Vector和Stack,想让ArrayList线程安全用sychronized把操作ArrayList的代码块包起来,或者sychorized(ArrayList),这样执行这部分代码的时候会加锁避免线程并发操作
      

  7.   

    有很多线程安全集合的
    http://www.blogjava.net/xylz/archive/2010/11/23/338853.html?opt=admin
    那做ssh开发时,如何考虑线程问题呢?
    这个就需要根据需求来了
    并发的问题 比较复杂的