List<String> list = Collections.synchronizedList(new ArrayList<String>());
synchronized (list) {
list.add("message");
}
Is the block "synchronized (list){} " really need here ?
List<String> list = Collections.synchronizedList(new ArrayList<String>());
synchronized (list) {
list.add("message");
}
Is the block "synchronized (list){} " really need here ?
It depends on the exact contents of the
synchronized
block:If the block performs a single, atomic operation on the list (as in your example), the
synchronized
is superfluous.If the block performs multiple operations on the list -- and needs to maintain the lock for the duration of the compound operation -- then the
synchronized
is not superfluous. One common example of this is iterating over the list.You don't need to synchronize as you put in your example. HOWEVER, very important, you need to synchronize around the list when you iterate it (as noted in the Javadoc):
Also Important to note that any methods that use Iterators for example Collections.sort() will also need to be encapsulated inside a synchronized block.
Like what has been mentioned by others, the synchronized collections are thread-safe, but the compound actions to these collections are not guaranteed to be thread-safe by default.
According to JCIP, the common compound actions can be
The OP's synchronized code block isn't a compound action, so no difference whether add it or not.
Let's take the example from JCIP and modify it a little to clarify why it's necessary to guard the compound actions with lock.
There are two methods that operate on same collection
list
that wrapped byCollections.synchronizedList
If methods
getLast
anddeleteLast
are called at the same time by two different threads, below interleaves may happen andgetLast
will throwArrayIndexOutOfBoundsException
. Assume currentlastIndex
is 10.Thread A (deleteLast) --> remove
Thread B (getLast) --------------------> get
The Thread A
remove
the element before theget
operation in Thread B. Thus, the Thread B still use 10 as thelastIndex
to calllist.get
method, it will lead to concurrent problem.The underlying code for Collections.synchronizedList add method is:
So in your example it is not needed to add synchronisation.
Read this Oracle Doc
It says "It is imperative that the user manually synchronize on the returned list when iterating over it"