Reputation: 2091
While reading Oracle tutorial on collections implementations, i found the following sentence :
If you need synchronization, a
Vector
will be slightly faster than anArrayList
synchronized withCollections.synchronizedList
source : List Implementations
but when searching for difference between them, many people discourage the using of Vector
and should be replaced by SynchronizedList
when the synchronization is needed.
So which side has right to be followed ?
Upvotes: 8
Views: 1416
Reputation: 298389
When you use Collections.synchronizedList(new ArrayList<>())
you are separating the two implementation details. It’s clear, how you could change the underlying storage model from “array based” to, e.g. “linked nodes”, by simply replacing new ArrayList
with new LinkedList
without changing the synchronized
decoration.
The statement that Vector
“will be slightly faster” seems to be based on the fact that its use does not bear a delegation between the wrapper and the underlying storage, but deriving statements about the performance from that was even questionable by the time, when ArrayList
and the synchronizedList
wrapper were introduced.
It should be noted that when you are really concerned about the performance of a list accessed by multiple threads, you will use neither of these two alternatives. The idea of making a storage thread safe by making all access methods synchronized
is flawed right from the start. Every operation that involves multiple access to the list, e.g. simple constructs like if(!list.contains(o)) list.add(o);
or iterating over the list or even a simple Collections.swap(list, i, j);
require additional manual synchronization to work correctly in a multi-threaded setup.
If you think it over, you will realize that most operations of a real life application consist of multiple access and therefore will require careful manual locking and the fact that every low level access method synchronizes additionally can not only take away performance, it’s also a disguise pretending a safety that isn’t there.
Upvotes: 2
Reputation: 2121
Vector is an old API, of course. No questions there.
For speed though, it might be only because the synchronized list involves extra method calls to reach and return the data since it is a "wrapper" on top of a list after all. That's all there is to it, imho.
Upvotes: 0