Java lambda表达式中的原子整数变量

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 ()

我将一个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
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
  • 将其传递给一个方法
  • 调用lambda实现的函数接口的方法
    由于您提供的代码绝不意味着lambda将从另一个线程调用(您没有提供任何真正的API调用),因此没有迹象表明您面临并发问题。

    除非您明确创建自己的线程(您不应该在
    Vertx
    中这样做),那你就没问题了

    “…这意味着您可以将应用程序中的所有代码作为单个 线程化,让Vert.x担心线程化和缩放。否 更担心同步和不稳定,你也 避免许多其他情况下的种族条件和僵局如此普遍 在执行手动滚动的“传统”多线程应用程序时 发展。”

    唯一的例外是,如果您使用的是
    多线程worker verticle
    ,您很可能不需要也不需要这样做


    如果您正在方法中生成一个新线程,您需要问自己为什么?这在
    Vert.x
    中几乎总是不需要的。如果您需要某种形式的代码>并行性< /代码>,请考虑将您的“作业”发送到<代码> EngestBue<代码>,并具有另一个<代码> Vistice 进程-将作业处理<代码> Vistue<代码>设置为您想要运行的并行进程的数量。p> 你好,Marko.我正在使用Vert.x框架,它使用异步编程。因此lambda被作为一个单独的线程处理。如果是这样,此代码仍然安全吗?
    AtomicInteger
    是线程安全的。然而,如果没有更多的细节,就不可能知道它是否真的需要。“正在另一个线程中处理”的信息不足以得出结论。是否需要任何copmpareAndSet操作?如果不是,一个可变布尔值就足够了。如果只有一个线程访问,则为非易失性字段。为什么不
    AtomicBoolean
    ?@TagirValeev,除非您实际需要
    Atomic*
    类提供的操作易失性字段具有较低的内存占用和较少的间接性。