我将AtomicInteger变量声明为实例变量,如下所示:
public class Test_class {
AtomicInteger status_flag = new AtomicInteger(1);
public Test_class() {
}
...
在代码中我在for循环中使用这个变量,在for循环中我有一个lambda表达式来更新这个变量。代码就像这样
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
这是一种正确的方法来确保不存在任何并发问题吗?如果为lambda表达式中的每个i生成一个新线程,我可以确定使用AtomicInteger将确保for循环将读取正确的status_flag值吗?
感谢您的帮助。
编辑:我使用的是使用异步编程的Vert.x Framework。
答案 0 :(得分:2)
执行以下任何操作时,不会自动生成任何线程:
由于您提供的代码绝不意味着将从另一个线程调用lambda(您没有提供任何真正的API调用),因此没有迹象表明您正面临并发问题。
答案 1 :(得分:0)
除非您明确创建自己的线程(在Vertx
中不应该这样做),否则您将没有问题。
“...这意味着您可以将应用程序中的所有代码编写为单个代码 有线程,让Vert.x担心线程和扩展。没有 更加担心同步和不稳定,你也 避免许多其他竞争条件和死锁案例如此普遍 在进行手工卷制的“传统”多线程应用时 发展“。
唯一的例外是如果您使用的是multi-threaded worker verticle
,您很可能不是,而且很可能不需要。
如果你在方法中产生一个新线程,你需要问问自己为什么?这在Vert.x
中几乎总是不受欢迎的。如果您需要某种形式的parallelism
,请考虑将您的“工作”发送到EventBus
并进行其他Verticle
处理 - 设置number of instances作业处理verticles
你要运行的并行进程的数量。