Синтаксис @synchronized
является расширением компилятора для реализации мьютекса. Я полагаю, вы поняли , что он делает . Компилятор переведет его во что-то другое, предположительно что-то похожее на критическую секцию , потому что он менее загружен процессором. Замки нужно отслеживать. Реализация будет использовать объект для записи состояния блокировки, чтобы сохранить ее целостность (то есть блокировка не должна быть получена дважды или разблокирована дважды).
В @synchronized(self)
объект не обязательно должен быть self
. Это может быть любой объективный объект. Обратите внимание, что один блок @synchronized
обычно ничего не делает (когда вы упоминали, что он не работает, он на самом деле ведет себя правильно). Но когда у вас есть два блока @synchronized
на одном и том же объекте 1013 *, одновременно будет выполняться только один блок, другому блоку придется ждать разблокировки блокировки (т.е. первый блок завершается ). Это помогает поддерживать синхронизацию, как в многопоточной среде.