Итак, у меня много потоков asyn, работающих одновременно. Теперь, когда какое-либо из заданий выходит из строя, я установил флаг с ошибкой boolean job true в true. Это означало бы, что одна из подзадач не выполнена. Могу ли я использовать статическую логическую переменную вместо параллельного атомарного логического элемента Java и по-прежнему иметь одинаковую функциональность?Разница между использованием static boolean vs AtomicBoolean для сигналов из потоков asyn
ответ
Могу ли я использовать статическую логическую переменную вместо Java параллельного атома boolean и все еще достичь той же функциональности?
Нет! Static означает что-то совершенно другое, чтобы Atomic
если вы определяете этот
static boolean staticFlag;
в классе Foo, то staticFlag это переменная, которая принадлежит классу, а не экземпляры класса ...
так что если вы Foo.staticFlag = true
, ВСЕ экземпляры класса Foo будет зависеть от этого изменения ..
о п, с другой стороны ..
если несколько потоков обращаются к тому же булеву то есть состояние гонки муравья есть вы можете использовать AtomicBoolean для предотвращения проблем с синхронизацией ...
Да. вы можете иметь
volatile static AtomicBoolean flag
Насколько я понимаю, вы «просто» хотят, чтобы установить глобальное состояние истинно, если один из многих нитей failes сделать что-то. Да, вы можете сделать это со статическим булевым, но вы должны объявить его изменчивым.
В моем мире вы можете это сделать, потому что не ваши потоки никогда не получат доступ к этому логическому для сравнения и т. Д. Если они обратятся к нему, они установят его в true. Им будет все равно, какое значение имеет логическое значение. Ни один нить никогда не установит значение false.
Но другой поток должен будет прочитать его, чтобы он не был «ложным», и там у вас есть ваша проблема. В этом случае вам нужно объявить его неустойчивым. –
Если вы установите его на 'volatile', неважно, было ли значение изменено несколько раз. Однако основной ответ правильный: «статический volatile boolean» - это то, что он хочет. –
Главное отличие является Thread-Safety, AtomicBoolean потокобезопасно, в то время как логическая переменная не поточно-, независимо от того, ее статический или нет. статическая переменная означает ее переменную класса, а не переменную экземпляра. см Oracle class variable
Чтобы ответить на ваш вопрос
Если доступ (чтение/запись) ваш флаг из разных потоков (которые вы, вероятно, сделать), используйте AtomicBoolean, в противном случае использовать стандартный логический достаточно. Но Я бы рекомендовал использовать AtomicBoolean
, так как вы имеете дело с несколькими потоками, которые записываются в флаг, а другой поток может его прочитать.
Второй вариант для обеспечения вашей безопасности потоков, используя ключевое слово volatile
как другие ответы заявили
public static volatile myFlag = false;
будет garenty потокобезопасность
'static' означает общий во всех случаях. Это не имеет ничего общего с безопасностью потока или атомарностью. –