поведение блокировки синхронного метода - PullRequest
0 голосов
/ 25 января 2019

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

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

class ObjectA {

public synchronized void methodA() {
  methodB();
  // do something else
}

}

class ObjectB {

public synchronized void methodB() {
  // do something
}

}

1 Ответ

0 голосов
/ 25 января 2019

Сообщите вашему коллеге-разработчику, что:

Поток, выполняющий статический синхронизированный метод , удерживает блокировку класса, а поток, выполняющий несатсинхронизированный метод удерживает блокировку объекта, для которого был вызван метод.(эти две блокировки различны, и эти потоки не блокируют друг друга).

Например:

public class Counter {
    private int count = 0;
    public void increment() {
       synchronized (this) {
       count++;
    }
}
public int getCount() {
    synchronized (this) {
        return count;
    }
}
}

Каждый созданный объект Java, включая каждый загруженный класс, имеет связанную блокировку илимонитор.

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

Между получением блокировки и ее освобождением говорится, что поток "1016 * владеет " замком.В точке нити А, желающей получить блокировку, если нить В уже владеет ею, то нить А должна ждать, пока нить В освободит ее.

В вашем случае, methodB () будет вызываться для объекта класса ObjectB , так как это нестатический метод.

Таким образом, при вводе methodB () блокировка на объект (для которого вызывается метод) класса ObjectB будет принадлежать потоку, как толькокак он видит methodB () синхронизируется .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...