Java lambda表达式中的原子整数变量
我将一个AtomicInteger变量声明为实例变量,如下所示:Java lambda表达式中的原子整数变量,java,lambda,java-8,vert.x,Java,Lambda,Java 8,Vert.x,我将一个AtomicInteger变量声明为实例变量,如下所示: public class Test_class { AtomicInteger status_flag = new AtomicInteger(1); public Test_class() { } ... 在代码中,我在for循环中使用这个变量,在for循环中,我有一个lambda表达式来更新这个变量。代码是这样的 public void some_class_func ()
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
public void some_class_func(){
...
对于(inti=0;i<10&&status_flag.get()==1;i++){
...
伪函数(x,test_lambda->{
...
如果(发生错误){
状态标志设置(0);
}
...
});
}//结束
}//结束函数
这是确保不会出现任何并发问题的正确方法吗?如果为lambda表达式中的每个i生成了一个新线程,我是否可以确保使用AtomicInteger将确保for循环读取正确的status_标志值
谢谢你的帮助
编辑:我使用的是使用异步编程的Vert.x Framework。执行以下操作时,不会自动生成任何线程:
由于您提供的代码绝不意味着lambda将从另一个线程调用(您没有提供任何真正的API调用),因此没有迹象表明您面临并发问题。除非您明确创建自己的线程(您不应该在
Vertx
中这样做),那你就没问题了
从
“…这意味着您可以将应用程序中的所有代码作为单个
线程化,让Vert.x担心线程化和缩放。否
更担心同步和不稳定,你也
避免许多其他情况下的种族条件和僵局如此普遍
在执行手动滚动的“传统”多线程应用程序时
发展。”
唯一的例外是,如果您使用的是多线程worker verticle
,您很可能不需要也不需要这样做
如果您正在方法中生成一个新线程,您需要问自己为什么?这在
Vert.x
中几乎总是不需要的。如果您需要某种形式的代码>并行性< /代码>,请考虑将您的“作业”发送到<代码> EngestBue<代码>,并具有另一个<代码> Vistice 进程-将作业处理<代码> Vistue<代码>设置为您想要运行的并行进程的数量。p> 你好,Marko.我正在使用Vert.x框架,它使用异步编程。因此lambda被作为一个单独的线程处理。如果是这样,此代码仍然安全吗?AtomicInteger
是线程安全的。然而,如果没有更多的细节,就不可能知道它是否真的需要。“正在另一个线程中处理”的信息不足以得出结论。是否需要任何copmpareAndSet操作?如果不是,一个可变布尔值就足够了。如果只有一个线程访问,则为非易失性字段。为什么不AtomicBoolean
?@TagirValeev,除非您实际需要Atomic*
类提供的操作易失性字段具有较低的内存占用和较少的间接性。