в документе Java говорит, что синхронизированная коллекция должна быть снова синхронизирована вручную на итерации. Почему это? Поскольку возвращенная коллекция уже синхронизирована. Не совсем понимаю, почему так. Спасибо.Зачем синхронизировать синхронизацию в синхронизации?
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
Тогда в чем смысл синхронизированной коллекции, предоставляемой коллекциями? Если нить A должна сначала «добавить» один элемент, тогда вам нужно проверить «размер», а поток B также получает доступ к коллекции, потенциально добавляя или удаляя. В таком случае, необходимо ли в этом случае поток A также локально синхронизировать коллекцию? – user697911
Вы можете проверить размер коллекции, не используя ее каким-либо другим способом (достаточно локальной синхронизации синхронизации). Пример: элемент пользовательского интерфейса, отображающий, сколько игроков находится в игре, не просматривая коллекцию у реальных игроков. –
В вашем случае использования, если Thread B только добавляет или удаляет элемент, а Thread A имеет синхронизированный блок вокруг добавления, а затем проверяет размер, нет проблем. Однако, если нет синхронизированного блока, Thread B может добавить/удалить элемент до проверки размера, что было бы проблематичным. Синхронизированная обертка коллекции позволяет случай, когда Thread B не нужно явно указывать какой-либо синхронизированный блок. –