Почему мы делаем это, если это не обеспечивает никакого удобства
То, что это не поможет вам, когда итерация не то же самое, что и отсутствие удобства.* Все методы - get
, size
, set
, isEmpty
и т. Д. - синхронизированы.Это означает, что они видят все записи, сделанные в любом потоке.
Без синхронизации нет гарантии, что обновления, сделанные в одном потоке, будут видимы для любых других потоков, поэтому один поток может видеть размер 5например, другой видит размер 6.
Механизм для синхронизации списка состоит в том, чтобы все его методы synchronized
: это фактически означает, что тело метода заключено в synchronized (this) { ... }
block.
Это все еще верно для метода iterator()
: это тоже synchronized
.Но блок synchronized
заканчивается, когда возвращается iterator()
, а не когда вы заканчиваете итерацию.Это фундаментальное ограничение способа разработки языка.
Поэтому вы должны помочь языку, добавив синхронизированный блок самостоятельно.