在网上搜了很多文章,发现有很多没讲清楚的,也有很多好文,本文但愿更易懂地描述该问题。若有不对的地方,请多多指正~~安全
vector的使用主要有以下两种场景:
(1)vector所谓的多线程安全,只是针对单纯地调用某个方法它是有同步机制的。如add,多个线程都在对同一个容器add元素,vector可以保证最后总数是正确的,而ArrayList没有同步机制,就没法保证。
(2)vector的多线程安全,在组合操做时不是线程安全的。好比一个线程先调用vector的size方法获得有10个元素,再调用get(9)方法获取最后一个元素,而另外一个线程调用remove(9)方法正好删除了这个元素,那第一个线程就会抛越界异常。多线程
总结:
(1)在须要对容器进行组合操做时,vector不适用(须要本身用synchronized将组合操做进行同步);
(2)仅在上述第一种场景时,才须要使用vectoride
public class TestMultiThread {线程
private static Vector<Integer> vec = new Vector<Integer>(); private static List<Integer> lst = new ArrayList<Integer>(); public void f() { TestThread testThread1 = new TestThread(); TestThread testThread2 = new TestThread(); Thread thread1 = new Thread(testThread1); Thread thread2 = new Thread(testThread2); thread1.start(); thread2.start(); } public static void main(String[] args) { TestMultiThread testMultiThread = new TestMultiThread(); testMultiThread.f(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("vec size is " + vec.size()); System.out.println("lst size is " + lst.size()); } private class TestThread implements Runnable { @Override public void run() { for (int i = 0; i < 1000; ++i) { vec.add(i); lst.add(i); } } }
}code
如上程序运行结果:
vec size is 2000
lst size is 1999rem