Мой вопрос связан с безопасностью потоков статических переменных.Безопасность потоков для статических переменных в java
Class A{
private static int test=0;
public static void synchronized m1(){
test=test+1;
}
public void synchronized m2(){
test=test+1;
}
}
Если две нити, t1, имеющих статический замок и t2, имеющий блокировку объекта, может продолжать одновременно, то, как будет указано испытание класса А будет поточно?
Может быть, я пропустил что-то очень основное, но не уверен, как это работает.
Основываясь на ответах ниже, я получаю впечатление, что если такие состояния имеют быть сделанным поточно, то либо оба замка должны быть проведены с помощью нити, которая обновляет это состояние, или убедитесь, что он является доступ к либо статическими методами, либо только нестационарными методами. правильно?
такой же вопрос http://stackoverflow.com/questions/5443297/concurrency-in-java-synchronized-static-methods – Hanan
Если вам нужна только операция increment/decment, вы можете использовать некоторые классы Atomic. Например, в AtomicInteger эти операции являются потокобезопасными (вам нужен специальный метод объекта). –
Об этом обновлении: важно то, что объект, который защищает критический фрагмент кода, всегда один и тот же. Вот что мой ответ делает: оба метода используют класс в качестве объекта монитора. Вы можете, когда вам нужно более мелкозернистую блокировку, также использовать другие объекты для синхронизации, и они могут быть либо статическими, либо переменными экземпляра. Использование определяет то, что подходит для использования - статично, когда вам нужно синхронизировать все экземпляры, иначе объект экземпляра. Я использовал этот класс в качестве монитора, так как была нужна поточная безопасная обработка статической переменной. – kiheru