Подтвердить что ты не робот

Синхронизированные методы в Java

Просто хочу проверить, чтобы я понял это. Синхронизированный метод не создает поток, не так ли? Он только гарантирует, что ни один другой поток не вызывает этот метод, в то время как один поток в рамках одного процесса (то есть JVM) использует его, правильно?

4b9b3361

Ответ 1

Синхронизированный метод не создает поток, правильно?

Right.

Он только гарантирует, что ни один другой поток не вызывает этот метод, пока один поток внутри одного процесса (т.е. JVM) использует его, правильно?

Right.

Для получения дополнительной информации прочитайте Синхронизированные методы. Я также рекомендую читать Java Concurrency на практике.

Ответ 2

Это в основном правильное. Вызов синхронизированного метода не порождает новый поток. Это просто блокирует другие потоки, когда они пытаются вызвать любой другой синхронизированный метод для этого экземпляра этого объекта.

Главное, чтобы помнить, что все синхронизированные методы класса используют одну и ту же блокировку.

Ответ 3

Да.

Существует и другая важная роль для синхронизированных блоков: когда поток входит в синхронизированный блок, он видит изменения в значениях, сделанных предыдущим потоком, который обратился к этому блоку (или другому блоку, синхронизированному с той же блокировкой).

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

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