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