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的结果。
需要进行线程相关的操作时就用Vector,不需要的时候就用ArrayList,因为异步的效率比较高。
真要实现集合类的同步而又不想synchronized块的话,java.util.concurrent 包里面有很多同步容器类,还有FIFO式的同步队列,Vector不推荐使用了。SSH大多是做Web开发的吧,本质上还是归结到Servlet类上,注意的是Servlet本身就是非线程安全的,因为每一个Servlet的请求都是同一个Servlet实例下多线程访问。Web开发时使用线程同步要什么谨慎的,因为线程同步会损耗较大的性能(加锁释放锁等),尤其是在高并发数的情况下。(这个我没有实战过的哈,一些想法而已。 ^_^)至于“数据库连接”这种大对象一般使用的是连接池或者对象池,甚至更大一点的对象或者十分重要的对象则使用单例的模式。
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的结果。
http://www.blogjava.net/xylz/archive/2010/11/23/338853.html?opt=admin
那做ssh开发时,如何考虑线程问题呢?
这个就需要根据需求来了
并发的问题 比较复杂的