Метод создания как синхронизирован имеет два эффекта:
Во-первых, два вызова синхронизированных методов для одного и того же объекта не могут чередоваться. Когда один поток выполняет синхронизированный метод для объекта, все остальные потоки, которые вызывают синхронизированные методы для того же блока объекта (приостанавливают выполнение), пока первый поток не завершится с объектом
Во-вторых, при выходе из синхронизированного метода он автоматически устанавливает отношение «до и после» с любым последующим вызовом синхронизированного метода для того же объекта. Это гарантирует, что изменения состояния объекта видны всем потокам.
Синхронизация поможет вам защитить критический код.
Если вы хотите установить связь между несколькими потоками, вы должны использовать wait () и notify () / notifyAll ()
wait()
: Заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта.
notify()
: Просыпается один поток, ожидающий на мониторе этого объекта. Если какие-либо потоки ожидают этого объекта, один из них выбирается для пробуждения.
notifyAll()
: Пробуждает все потоки, которые ожидают на мониторе этого объекта. Поток ожидает на мониторе объекта, вызывая один из методов ожидания.
Простой пример использования wait () и notify (): Проблема производителя и потребителя .
Поток-потребитель должен ждать, пока поток-производитель не выдаст данные. wait () и notify () полезны в приведенном выше сценарии. За определенный период времени были введены лучшие альтернативы. Обратитесь к этой высокоуровневой параллельной странице учебника.
Проще говоря:
Используйте synchronized
для защиты критической части ваших данных и защиты вашего кода.
Используйте wait()
и notify()
вместе с синхронизацией, если вы хотите установить безопасное соединение между несколькими потоками, которые зависят друг от друга.
Связанные вопросы SE:
Что означает «синхронизированный»?
Простой сценарий с использованием wait () и notify () в java