В соответствии с моим пониманием параллельные классы коллекций предпочитают более синхронизированные коллекции, потому что классы параллельной коллекции не берут блокировки для всего объекта коллекции. Вместо этого они берут блокировки на небольшом сегменте объекта коллекции.
Но когда я проверил метод add
CopyOnWriteArrayList
, мы приобретаем блокировку для полного объекта коллекции. Тогда как получилось CopyOnWriteArrayList
лучше, чем список, возвращаемый Collections.synchronizedList
? Единственное отличие, которое я вижу в методе add
CopyOnWriteArrayList
, заключается в том, что мы создаем копию этого массива каждый раз, когда вызывается метод add
.
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}