1

Я знаю, что staticsynchronized метод заблокирован на class объекта, и в то время как экземпляр synchronized метода замков на текущий экземпляр объекта т.е. this.ресурсов распределяются между статическими и не-статические методы в Java

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

Рассмотрим следующий пример

public class Test { 
    static int count = 0; 

    public synchronized void f1(){ 
    count++; 
    } 

    public static synchronized void f2(){ 
    count++; 
    } 
} 

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

Что такое решение в этой ситуации? Я задаю правильный вопрос, если нет, пожалуйста, сделайте меня правильным? И если это правда, то какое решение делает java pr ovoids?

ответ

3

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

public void f1() { 
    synchronized(Test.class) { 
    count++; 
    } 
} 
3

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

С count является статическим, поэтому его изменение из блока с нестатической синхронизацией неверно. Для правильного кода, а также для избежания дублирования кода, звоните f2 от f1, например:

public void f1(){ 
    ... // Do something ... 
    f2(); 
    ... // Do something else ... 
} 

public static synchronized void f2(){ 
    count++; 
} 
Смежные вопросы