2012-06-10 2 views
2

Say текущий поток удерживает блокировку, то же поток вызываетбудет причиной возникновения взаимоблокировки?

synchronize(lock) 

снова будет тупик произойдет?

Я смутно помню, что замок является повторным для той же темы, что это значит?

+3

Как насчет поискового робота? –

ответ

8

От documentation:

Thread не может получить блокировку, принадлежащую другой нити. Но нить может приобрести блокировку, которой она уже владеет. Разрешающая нить к получает один и тот же замок более одного раза, обеспечивает повторный вход синхронизации. Это описывает ситуацию, когда синхронизированный код прямо или косвенно вызывает метод, который также содержит синхронизируемый код , и оба набора кода используют одну и ту же блокировку.

7

Вы правильно помню, возвратного означает, что тот же поток может получить ту же блокировку несколько раз, например:

private final Object lock = new Object(); 

public void foo() { 
    synchronized(lock) { 
     bar(); 
    } 
} 

public void bar() { 
    synchronized(lock) { 
     //... 
    } 
} 

работает, как ожидалось, а также (здесь this используется как неявный объект блокировки):

public synchronized void foo() { 
    bar(); 
} 

public synchronized void bar() { 
    //... 
} 

и не возникает взаимоблокировок. Конечно, другие потоки не могут получить доступ ни к foo(), ни к bar() в то же время, потому что замок уже сделан.

Нижняя строка: блокировки берутся по нити, а не по методам/блокам кода. И сделать блокировку, уже полученную тем же потоком, является no-op.

0

Каждый object имеет lock and a key, чтобы защитить его crucial data state, так же защищает every Class has a lock and a key, чтобы его crucial static data state.

synchronized keyword on the atomic statements (либо метод или распыленной заявления)

будет как блокировка объекта. Когда поток получает доступ к этому методу или атомному заявлению, , он должен получить key for that object.

Once it obtains the key, 
its free to access this synchronized method/statement 
or any other synchronized method/statement of that object. 
Thats what reentrant is all about. 

Но никакой другой поток не сможет получать доступ synchornized блоки этого объекта до текущего ключа удержания нити, отпустить ключ.