Синхронизация

Поскольку многопоточность дает вашим программам возможность асинхронного поведения, должен существовать способ обеспечить синхронизацию, когда в этом возникает необходимость. Например, если вы хотите, чтобы два потока взаимодействовали и разделяли сложную структуру данных, такую как связный список, то вы нуждаетесь в каком-то способе исключения конфликтов между ними. То есть вы должны предотвратить запись данных в одном потоке, когда другой занимается их чтением. Для этой цели в Java реализован элегантный трюк из старой модели межпроцессной синхронизации, а именно — монитор. Монитор — это управляющий механизм, впервые реализованный Чарльзом Энтони Ричардом Хоаром. Вы можете воспринимать монитор как очень маленький ящик, который принимает только один поток в единицу времени. Как только поток вошел в монитор, все другие потоки должны ждать, пока тот не покинет его. Таким образом, монитор может быть использован для защиты разделяемых ресурсов от одновременного использования более чем одним потоком.

Большинство многопоточных систем применяют мониторы как объекты, которые ваша программа может получить и которыми она может манипулировать. Java предлагает более чистое решение. Не существует отдельного класса монитора вроде "Monitor". Вместо этого каждый объект имеет свой собственный неявный монитор, вход в который осуществляется автоматически, когда вызывается синхронизированный метод объекта. Когда поток находится внутри синхронизированного метода, ни один другой поток не может вызвать никакого синхронизированного метода этого объекта. Это позволяет вам писать очень ясный и краткий многопоточный код, поскольку поддержка синхронизации встроена в язык.