Java中的并发容器
- List
- Set
- Map
- Queue
这些容器对应线程不安全的有 ArrayList 、LinkedSet、HashMap、PriorityQueue 等等
这些可以采用Collections.synchronized 方法包装成对应线程安全的,或者是直接使用Java提供对应的线程安全的包
List list = Collections.
synchronizedList(new ArrayList());
Set set = Collections.
synchronizedSet(new HashSet());
Map map = Collections.
synchronizedMap(new HashMap());
并发容器迭代中容易出现的误区
在上面介绍中 我们知道 可以使得容器安全 那是不是迭代过程中 安全的容器不会出错呢
List list = Collections.
synchronizedList(new ArrayList());
Iterator i = list.iterator();
while (i.hasNext()) {
i.next();
}
其实不是 在上面迭代过程中 i.hasNext() 和 i.next() 不在一个原子操作,所以不管容器属于线程安全不安全的问题 这种遍历都会出错
正确的做法 在遍历的过程中 直接锁住容器
List list = Collections.
synchronizedList(new ArrayList());
synchronized (list) {
Iterator i = list.iterator();
while (i.hasNext())
i.next();
}