Как сделать переменную состояния потокобезопасной

1

Предположим, что у меня есть класс, имеющий статическую переменную-член. В этом классе присутствуют два синхронизированных метода: static и instance, и оба метода пытаются изменить значение статической переменной-члена. Первый поток имеет блокировку на объекте этого класса, поэтому первый поток может обращаться к статическому синхронизированному и синхронизированному экземпляру. Второй поток имеет блокировку уровня класса, поэтому он может получить доступ только к статическому синхронизированному методу. В этом случае, как добиться безопасности потоков.

  • 0
    Выложите немного кода, пожалуйста :)
  • 0
    не ясно. пост и пример. синхронизированный метод использует объект класса в качестве блокировки.
Показать ещё 3 комментария
Теги:
multithreading

1 ответ

0
Лучший ответ

Либо добавьте дополнительный 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);
        }
    }
}
  • 0
    Дополнительный объект блокировки означает что-то похожее на это: приватная статическая финал Object lock = new Object (). Можем ли мы сделать эту статическую переменную, state, как volatile и нет необходимости упоминать синхронизированное ключевое слово?
  • 0
    @jasminum: Это зависит от типа и операций, если вы можете использовать volatile или атомарный тип вместо synchronized . Вы должны предоставить больше информации в этом случае.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню