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

Когда два или более потоков имеют доступ к одному разделенному ресурсу, они нуждаются в обеспечении того, что ресурс будет использован только одним потоком одновременно. Процесс, с помощью которого это достигается, называется синхронизацией. Как вы увидите, Java предлагает ее уникальную поддержку на уровне языка.

Ключом к синхронизации является концепция монитора (также называемого семафором). Монитор — это объект, который используется, как взаимное исключение (mutually exclusive lock — mutex), или мьютекс. Только один поток одновременно может владеть монитором. Когда поток запрашивает блокировку, говорят, что он входит в монитор. Все другие потоки, которые пытаются войти в заблокированный монитор, будут приостановлены до тех пор, пока первый поток не выйдет из монитора. Обо всех этих прочих потоках говорят, что они ожидают монитора. Поток, который владеет монитором, может повторно войти в него, если пожелает.

Если вы имели дело с синхронизацией в других языках, таких как С или С++, то знаете, что использовать ее не просто. Это потому, что эти языки сами по себе не поддерживают синхронизацию. Вместо этого, чтобы синхронизировать потоки, ваша программа должна использовать примитивы операционной системы. К счастью, поскольку Java реализует синхронизацию через языковые элементы, большая часть сложности, ассоциированная с синхронизацией, исчезает.

Вы можете синхронизировать ваш код двумя способами. Оба предусматривают использование ключевого слова synchronized, и оба способа мы здесь рассмотрим.