Java Reference
In-Depth Information
The concurrent collections, on the other hand, are designed for concurrent access from mul-
tiple threads. Java 5.0 adds ConcurrentHashMap , a replacement for synchronized hash-
based Map implementations, and CopyOnWriteArrayList , a replacement for synchron-
ized List implementations for cases where traversal is the dominant operation. The new
ConcurrentMap interface adds support for common compound actions such as put-if-ab-
sent, replace, and conditional remove.
Replacing synchronized collections with concurrent collections can offer dramatic scalability
improvements with little risk.
Java 5.0 also adds two new collection types, Queue and BlockingQueue . A Queue is
intended to hold a set of elements temporarily while they await processing. Several imple-
mentations are provided, including ConcurrentLinkedQueue , a traditional FIFO queue,
and PriorityQueue , a (non concurrent) priority ordered queue. Queue operations do not
block; if the queue is empty, the retrieval operation returns null . While you can simulate the
behavior of a Queue with a List —in fact, LinkedList also implements Queue —the
Queue classes were added because eliminating the random-access requirements of List ad-
mits more efficient concurrent implementations.
BlockingQueue extends Queue to add blocking insertion and retrieval operations. If the
queue is empty, a retrieval blocks until an element is available, and if the queue is full (for
bounded queues) an insertion blocks until there is space available. Blocking queues are ex-
tremely useful in producer-consumer designs, and are covered in greater detail in Section 5.3 .
Just as ConcurrentHashMap is a concurrent replacement for a synchronized hash-based
Map , Java 6 adds ConcurrentSkipListMap and ConcurrentSkipListSet , which
are concurrent replacements for a synchronized SortedMap or SortedSet (such as
TreeMap or TreeSet wrapped with synchronizedMap ).
5.2.1. ConcurrentHashMap
The synchronized collections classes hold a lock for the duration of each operation. Some op-
erations, such as HashMap.get or List.contains , may involve more work than is ini-
tially obvious: traversing a hash bucket or list to find a specific object entails calling equals
(which itself may involve a fair amount of computation) on a number of candidate objects. In
a hash-based collection, if hashCode does not spread out hash values well, elements may
Search WWH ::




Custom Search