Say текущий поток удерживает блокировку, то же поток вызываетбудет причиной возникновения взаимоблокировки?
synchronize(lock)
снова будет тупик произойдет?
Я смутно помню, что замок является повторным для той же темы, что это значит?
Say текущий поток удерживает блокировку, то же поток вызываетбудет причиной возникновения взаимоблокировки?
synchronize(lock)
снова будет тупик произойдет?
Я смутно помню, что замок является повторным для той же темы, что это значит?
От documentation:
Thread не может получить блокировку, принадлежащую другой нити. Но нить может приобрести блокировку, которой она уже владеет. Разрешающая нить к получает один и тот же замок более одного раза, обеспечивает повторный вход синхронизации. Это описывает ситуацию, когда синхронизированный код прямо или косвенно вызывает метод, который также содержит синхронизируемый код , и оба набора кода используют одну и ту же блокировку.
Вы правильно помню, возвратного означает, что тот же поток может получить ту же блокировку несколько раз, например:
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.
Каждый 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 блоки этого объекта до текущего ключа удержания нити, отпустить ключ.
Как насчет поискового робота? –