2013-10-07 3 views
0

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

class A { 
    void m1() { 
     synchronized (this) { 
     } 
     blah blah blah 
     synchronized (this) { 
     } 
    } 
} 

Мои сомнения при выполнении бла-бла-бла, выполняемой в данный момент поток с БЛокИРовкИ объект О, в это время, если другой поток с объектом O получает блокировку, Там будет тупик. Итак, как мы можем сказать, что мы должны попытаться использовать синхронизированный блок вместо синхронизированного метода?

Предположим, что поток t1 выполняет статический синхронизированный метод, который получает блокировку уровня класса, может ли другой поток получить блокировку экземпляра этого класса для выполнения других синхронизированных методов?

ответ

2

Выполняя «blah blah blah», текущий исполняемый поток не имеет никаких замков. Возможно, что другой поток получит блокировку объекта, но это не приведет к тупиковой ситуации. Первый поток будет просто блокироваться, пока другой поток не освободит блокировку.

Тупик возникает, когда нить A владеет блокировкой 1, но требуется блокировка 2, в то время как нить B владеет блокировкой 2, но требуется блокировка 1. Это не происходит в вашей ситуации.

Блокировка уровня класса - это другой замок, чем блокировка экземпляра объекта. Таким образом, блокировка уровня класса не будет мешать другому потоку, выполняющему другие синхронизированные методы для объекта.

+0

+1 Одна вещь, о которой стоит беспокоиться, заключается в том, что если есть блокировка на уровне класса _and_, блокировка экземпляра, то вы можете иметь тупик в зависимости от порядка блокировки этих двух замков. – Gray

2

Да. Синхронизация по объекту полностью не зависит от синхронизации объекта Class<?> для класса объекта.

Смежные вопросы

 Смежные вопросы