Найти тему
DEBAGanov

Java 484.

484. Как вы знаете, синхронизированные статические методы требуют блокировки на уровне класса, а синхронизированные нестатические методы требуют блокировки на уровне объекта. Можно ли запустить эти два метода одновременно?

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

Синхронизация на уровне класса и объекта осуществляется по-разному, и они используют разные мониторы (lock objects). Синхронизированный статический метод блокирует монитор на уровне класса, а синхронизированный нестатический метод блокирует монитор на уровне экземпляра объекта.

Если два потока попытаются одновременно вызвать синхронизированный статический метод и синхронизированный нестатический метод этого же класса из разных объектов, то они могут работать параллельно без конфликтов. Но если оба потока будут пытаться использовать один и тот же объект, то один поток будет блокирован до тех пор, пока другой поток не завершит свою работу.

Вот пример кода на Java, который демонстрирует, как блокировка на уровне класса и объекта может приводить к ситуации состояния гонки:

public class MyClass {
private static int counter = 0;
private int id;

public MyClass(int id) {
this.id = id;
}

public static synchronized void incrementCounter() {
counter++;
System.out.println("Static method: Counter value = " + counter);
}

public synchronized void incrementId() {
id++;
System.out.println("Instance method: Object ID = " + id);
}
}

public class Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass(1);
MyClass obj2 = new MyClass(2);

Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
obj1.incrementCounter();
}
});

Thread t2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
obj2.incrementId();
}
});

t1.start();
t2.start();
}
}

В этом примере создаются два объекта obj1 и obj2 класса MyClass. Поток t1 вызывает статический метод incrementCounter() объекта obj1, а поток t2 вызывает нестатический метод incrementId() объекта obj2. Если запустить эту программу, то ее результат будет непредсказуемым, так как возможны состояния гонки в момент выполнения методов одного и того же класса. Чтобы избежать состояний гонки, необходимо правильно синхронизировать общие ресурсы между потоками.

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov