Предположим, что у меня есть класс, имеющий статическую переменную-член. В этом классе присутствуют два синхронизированных метода: static и instance, и оба метода пытаются изменить значение статической переменной-члена. Первый поток имеет блокировку на объекте этого класса, поэтому первый поток может обращаться к статическому синхронизированному и синхронизированному экземпляру. Второй поток имеет блокировку уровня класса, поэтому он может получить доступ только к статическому синхронизированному методу. В этом случае, как добиться безопасности потоков.
Либо добавьте дополнительный synchronized
блок к методу экземпляра, который синхронизирован в объекте класса, либо используйте дополнительный объект блокировки. В следующем листинге показано первое:
class Foo {
private static Set<String> state = new HashSet<>();
public static synchronized void bar(String item) {
state.add(item);
}
public /* synchronized */ baz(String item) {
synchronized (Foo.class) {
state.add(item);
}
}
}
volatile
или атомарный тип вместо synchronized
. Вы должны предоставить больше информации в этом случае.