Сообщите вашему коллеге-разработчику, что:
Поток, выполняющий статический синхронизированный метод , удерживает блокировку класса, а поток, выполняющий несатсинхронизированный метод удерживает блокировку объекта, для которого был вызван метод.(эти две блокировки различны, и эти потоки не блокируют друг друга).
Например:
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 () синхронизируется .