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