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

Синхронизировать (это) против синхронизации (MyClass.class)

Возможный дубликат:
Java Synchronized Block для .class

Я читал статью о синхронизации. Я запутался в нижних точках и нуждаюсь в большем пояснении.

1) Для блока синхронизации. Как

   synchronize(this){
    // code
   }

отличается от

   synchronize(MyClass.class){
    //code
   }

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

4b9b3361

Ответ 1

MyClass.class и this - разные вещи, разные ссылки на разные объекты.

this - ссылка на конкретный экземпляр класса и

MyClass.class - ссылка на объект описания MyClass.

Эти блоки синхронизации отличаются тем, что первая синхронизирует все потоки, которые конкретно конкретизируются с этим экземпляром MyClass, а второй синхронизирует потоки все независимо от который объект, на который был вызван этот метод.

Ответ 2

Первый пример (фиксация на this) предназначен для использования в методах экземпляра, второй - для блокировки объекта class) - в static.

Если один поток получает блокировку на MyClass.class, другим потокам придется ждать, чтобы ввести синхронизированный блок метода static, в котором находится этот блок. Между тем, все потоки смогут получить блокировку для конкретный экземпляр этого класса и методы экземпляра экземпляра.