Только один поток выполнения может изменить состояние контейнера в любой момент времени.
Если контейнер не был синхронизирован, несколько потоков выполнения могли бы попытаться изменить состояние контейнера одновременно. Конечно, это, скорее всего, приведет к повреждению внутреннего состояния контейнера, т. Е. Не к тому, что вы хотите.
Оригинальные контейнеры Java, например, java.util.Vector и java.util.Hashtable, все были синхронизированы по соображениям безопасности. Но недостатком синхронизации доступа по умолчанию является то, что в тех случаях, когда синхронизация не нужна, снижается производительность синхронизации. Так что теперь Java поставляется с несинхронизированными контейнерами, например, ArrayList и HashMap.