早期线程安全的集合
我们先从早期的线程安全的集合说起,它们是Vector和HashTable
- Vector
Vector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用 - HashTable
HashTable和HashMap类似,不同点是HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的K,V都不能是null,但HashMap可以,它现在也因为性能原因被弃用了。
Collections包装方法
Vector和HashTable被弃用后,它们被ArrayList和HashMap代替,但它们不是线程安全的,所以Collections工具类中提供了相应的包装方法把它们包装成线程安全的集合
List<E> synArrayList = Collections.synchronizedList(new ArrayList<E>());
Set<E> synHashSet = Collections.synchronizedSet(new HashSet<E>());
Map<K,V> synHashMap = Collections.synchronizedMap(new HashMap<K,V>());
每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步
java.util.concurrent包中的集合
image.pngPattern: Concurrent* Blocking* CopyonWrite*
- CopyOnWrite 是读写分离
- Concurrent是 保护线程安全的, 但是拿不到数据,放不进去 也允许。
- Blocking是为producer consumer 设计的,一定要拿到或者放入数据。 拿不到,或者没东西放就阻塞等待。除非调用端放弃。
从下面开始就要开始介绍线程安全结合了。这也是并发编程的最后一章。
网友评论