5.2 非线程安全集合类
● java.util.BitSet
● java.util.HashSet (LinkedHashSet)
● java.util.TreeSet
● java.util.HashMap (WeekHashMap, TreeMap, LinkedHashMap, IdentityHashMap)
● java.util.ArrayList (LinkedList)
● java.util.PriorityQueue
这些非线程安全的集合可以通过java.util.Collections.SynchronizedList、SynchronizedMap、SynchronizedSet等方法包装成线程安全的集合。包装器类简单地给被包装集合的各项操作加上了synchronized保护。值得注意的是在使用游标遍历这些包装器集合的时候必须加上额外的synchronized保护,否则会出现问题。
List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } |
5.3 线程通知集合类
● java.util.concurrent.ArrayBlockingQueue
● java.util.concurrent.LinkedBlockingQueue
● java.util.concurrent.SynchronousQueue
● java.util.concurrent.PriorityBlockingQueue
● java.util.concurrent.DelayQueue
这些集合类都实现了BlockingQueue接口。阻塞队列的特点是当从队列中取出元素时如果队列为空,线程会被阻塞直到队列中有元素被插入。当从队列中插入元素时如果队列已满,线程会被阻塞直到队列中有元素被取出出现空闲空间。阻塞队列可以用来实现生产者消费者模式(Producer/Consumer Pattern) 。