2014-11-30 4 views
0

Мой вопрос связан с безопасностью потоков статических переменных.Безопасность потоков для статических переменных в 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, имеющий блокировку объекта, может продолжать одновременно, то, как будет указано испытание класса А будет поточно?

Может быть, я пропустил что-то очень основное, но не уверен, как это работает.

Основываясь на ответах ниже, я получаю впечатление, что если такие состояния имеют быть сделанным поточно, то либо оба замка должны быть проведены с помощью нити, которая обновляет это состояние, или убедитесь, что он является доступ к либо статическими методами, либо только нестационарными методами. правильно?

+0

такой же вопрос http://stackoverflow.com/questions/5443297/concurrency-in-java-synchronized-static-methods – Hanan

+0

Если вам нужна только операция increment/decment, вы можете использовать некоторые классы Atomic. Например, в AtomicInteger эти операции являются потокобезопасными (вам нужен специальный метод объекта). –

+0

Об этом обновлении: важно то, что объект, который защищает критический фрагмент кода, всегда один и тот же. Вот что мой ответ делает: оба метода используют класс в качестве объекта монитора. Вы можете, когда вам нужно более мелкозернистую блокировку, также использовать другие объекты для синхронизации, и они могут быть либо статическими, либо переменными экземпляра. Использование определяет то, что подходит для использования - статично, когда вам нужно синхронизировать все экземпляры, иначе объект экземпляра. Я использовал этот класс в качестве монитора, так как была нужна поточная безопасная обработка статической переменной. – kiheru

ответ

5

Это не потолочный сейф. Методы используют разные объекты монитора: статический метод использует класс, а метод экземпляра синхронизируется с использованием экземпляра объекта. Вы можете использовать метод экземпляра для использования в качестве объекта монитора:

synchronized (A.class) { 
... 

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

0

Его небезопасный поток, и вы (автор вопроса) очень хорошо объяснили, почему.

Смежные вопросы