Синхронизация (это) против синхронизации (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 метод, в котором находится этот блок. Между тем все потоки смогут получить блокировку для конкретного экземпляра этого класса и выполнить методы экземпляра.

Другие вопросы по тегам