2016-06-17 4 views
1

Итак, у меня много потоков asyn, работающих одновременно. Теперь, когда какое-либо из заданий выходит из строя, я установил флаг с ошибкой boolean job true в true. Это означало бы, что одна из подзадач не выполнена. Могу ли я использовать статическую логическую переменную вместо параллельного атомарного логического элемента Java и по-прежнему иметь одинаковую функциональность?Разница между использованием static boolean vs AtomicBoolean для сигналов из потоков asyn

+1

'static' означает общий во всех случаях. Это не имеет ничего общего с безопасностью потока или атомарностью. –

ответ

1

Могу ли я использовать статическую логическую переменную вместо Java параллельного атома boolean и все еще достичь той же функциональности?

Нет! Static означает что-то совершенно другое, чтобы Atomic

если вы определяете этот

static boolean staticFlag; 

в классе Foo, то staticFlag это переменная, которая принадлежит классу, а не экземпляры класса ...

так что если вы Foo.staticFlag = true, ВСЕ экземпляры класса Foo будет зависеть от этого изменения ..

о п, с другой стороны ..

если несколько потоков обращаются к тому же булеву то есть состояние гонки муравья есть вы можете использовать AtomicBoolean для предотвращения проблем с синхронизацией ...

0

Да. вы можете иметь

volatile static AtomicBoolean flag 
1

Насколько я понимаю, вы «просто» хотят, чтобы установить глобальное состояние истинно, если один из многих нитей failes сделать что-то. Да, вы можете сделать это со статическим булевым, но вы должны объявить его изменчивым.

В моем мире вы можете это сделать, потому что не ваши потоки никогда не получат доступ к этому логическому для сравнения и т. Д. Если они обратятся к нему, они установят его в true. Им будет все равно, какое значение имеет логическое значение. Ни один нить никогда не установит значение false.

+1

Но другой поток должен будет прочитать его, чтобы он не был «ложным», и там у вас есть ваша проблема. В этом случае вам нужно объявить его неустойчивым. –

+0

Если вы установите его на 'volatile', неважно, было ли значение изменено несколько раз. Однако основной ответ правильный: «статический volatile boolean» - это то, что он хочет. –

0

Главное отличие является Thread-Safety, AtomicBoolean потокобезопасно, в то время как логическая переменная не поточно-, независимо от того, ее статический или нет. статическая переменная означает ее переменную класса, а не переменную экземпляра. см Oracle class variable

Чтобы ответить на ваш вопрос

Если доступ (чтение/запись) ваш флаг из разных потоков (которые вы, вероятно, сделать), используйте AtomicBoolean, в противном случае использовать стандартный логический достаточно. Но Я бы рекомендовал использовать AtomicBoolean, так как вы имеете дело с несколькими потоками, которые записываются в флаг, а другой поток может его прочитать.

Второй вариант для обеспечения вашей безопасности потоков, используя ключевое слово volatile как другие ответы заявили

public static volatile myFlag = false; 

будет garenty потокобезопасность