从Java的初始版本开始,Vector和HashTable类就提供了线程安全的动态数组和散列表的实现,从JavaSE 1.2开始这些类被弃用了,取而代之的是ArrayList和HashMap类,这些类别不是线程安全的,而集合库中提供了不同的机制,任何集合类都可以通过使用同步包装器(synchronization wrapper)变成线程安全的:
List<E> synchArrayList=Collections.synchronizedList(new ArrayList<E>());
Map<K,V> synchHashMap=Collections.synchronizedMap(new HashMap<K,V>());
结果集合的方法使用锁加以保护,提供了线程的安全访问。
现阶段还是推荐使用List集合,如果需要保证数据的原子性,一般不再使用同步包装器中的了,而是使用java.util.concurrent包中定义的集合,例如ConcurrentHashMap已经精心实现了,多线程可以访问它而且不会彼此堵塞。 |