I'm using Collections.synchronizedCollection in Java to protect a Set that I know is getting accessed concurrently by many threads. The Java API warns:
" It is imperative that the user manually synchronize on the returned collection when iterating over it:
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the syn开发者_运维技巧chronized block
while (i.hasNext())
foo(i.next());
}
"
If I use c.contains(obj)
, is that thread-safe? Internally, obviously, this is iterating over the Collection and seeing if any of the objects in it are equal to obj. My instinct is to assume that this is probably synchronized (it would seem to be a major failing if not), but given previous pains with synchronization, it seems wise to double-check, and a Google search for answers on this hasn't turned up anything.
In itself, a call to contains
is safe.
The problem is that one often tests whether a collection contains an element then does something to the collection based on the result.
Most likely, the test and the action should be treated as a single, atomic operation. In that case, a lock on the collection should be obtained, and both operations should be performed in the synchronized
block.
Collections.synchronizedCollection()
will return a thread safe
collection which means
any single method call is thread safe
by itself. It depends what you want do. If you want to call couple of methods, java cannot make it thread safe together.
It's safe, because contains
itself is synchronized.
精彩评论