Синхронизация (это) против синхронизации (MyClass.class)
Возможный дубликат:
Синхронизированный блок Java для.class
Я читал статью о синхронизации. Я запутался в следующих пунктах
1) Для блока синхронизации. Как
synchronize(this){
// code
}
отличается от
synchronize(MyClass.class){
//code
}
2) Синхронизация метода экземпляра означает, что потоки должны будут получить эксклюзивную блокировку для экземпляра, в то время как синхронизация статического метода означает, что поток должен будет получить блокировку для всего класса (поправьте меня, если я ошибаюсь). Таким образом, если у класса есть три метода, и один из них статически синхронизирован, то, если поток получает блокировку для этого метода, это означает, что он получит блокировку для всего класса, а это означает, что два других также будут заблокированы, и никакой другой метод не сможет получить доступ к этим двум методам, поскольку весь класс имеет блокировку?
2 ответа
MyClass.class
а также this
это разные вещи, это разные ссылки на разные объекты.
this
- это ссылка на конкретный экземпляр класса, и
MyClass.class
- это ссылка на MyClass
описание объекта.
Эти блоки синхронизации отличаются тем, что первый будет синхронизировать все потоки, которые имеют дело конкретно с этим экземпляром MyClass
и второй будет синхронизировать все потоки независимо от того, какой объект был вызван для этого метода.
Первый пример (получение блокировки на this
) предназначен для использования в методах экземпляра, второй (получение блокировки на class
объект) - в static
методы.
Если один поток получает блокировку на MyClass.class
другим потокам придется ждать, чтобы войти в синхронизированный блок static
метод, в котором находится этот блок. Между тем все потоки смогут получить блокировку для конкретного экземпляра этого класса и выполнить методы экземпляра.