Я переменная AtomicInteger объявлена как переменная экземпляра, как это:AtomicInteger переменные в лямбда-выражения
public class Test_class {
AtomicInteger status_flag = new AtomicInteger(1);
public Test_class() {
}
...
В коде я использую эту переменную в цикле, так и внутри для цикла у меня есть лямбда-выражения который обновляет эту переменную. Код идет как этот
public void some_class_func() {
...
for (int i=0; i< 10 && status_flag.get() == 1; i++) {
...
dummy_func(x, test_lambda -> {
...
if (some error occurs) {
status_flag.set(0);
}
...
});
}//END for
}//END func
Является ли это правильный способ сделать это, чтобы быть уверенным, что не будет никаких проблем параллелизма? Если новый поток генерируется для каждого i в выражении лямбда, могу ли я быть уверенным, что использование AtomicInteger будет гарантировать, что цикл for будет читать правильное значение status_flag?
Благодарим за помощь.
EDIT: Я использую Vert.x Framework, который использует асинхронное программирование.
Вам нужны какие-либо операции copmpareAndSet? если не достаточно летучего булева. или энергонезависимой, если только один поток обращается к ней. – the8472
Почему не 'AtomicBoolean'? –
@TagirValeev, если вам действительно не нужны операции, предоставляемые классами «Atomic *», поле volatile имеет меньшую площадь памяти и меньше ограничений. – the8472