早期的线程
    Vector,它和ArrayList类似,是一个长度可变的数据,不同的是它是线程安全的,他的几乎所有的public方法都加上了synchronized关键字,所以性能就低了,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以已经被弃用了
    HashTable也是线程安全的,也是几乎所有的public方法都加上了synchronized关键字,他的kv都不能为null,hashmap可以,HashTable也是因为性能问题所以大多用hashmap
    哎,Vector被ArrayList取代,HashTable被HashMap取代,俩线程安全的集合都不咋用了,所以怎么办呢,
    所以Conllections工具类中提供了相应的包装方法,把他们包装哼了线程安全的集合,

    1. List<E> synArrayList = Conllections.synchronizedList(new ArrayList<E>());
    2. Set<E> synSet = Conllections.synchronizedSet(new HashSet<E>());
    3. Map<K,V> synHashMap= Conllections.synchronizedHashMap(new HashMap<K,V>());
    4. ......

    Collections针对每种集合都声明了一个线程安全的包装类,在原集合的基础上加了锁对象,集合中的每个方法都通过这个锁对象实现同步