lambda表达式中的AtomicInteger变量

时间:2015-08-05 16:12:25

标签: 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 () {  
...

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。

2 个答案:

答案 0 :(得分:2)

执行以下任何操作时,不会自动生成任何线程:

  1. 创建一个lambda;
  2. 将其传递给方法;
  3. 调用lambda实现的功能接口的方法。
  4. 由于您提供的代码绝不意味着将从另一个线程调用lambda(您没有提供任何真正的API调用),因此没有迹象表明您正面临并发问题。

答案 1 :(得分:0)

除非您明确创建自己的线程(在Vertx中不应该这样做),否则您将没有问题。

来自Vertx docs

  

“...这意味着您可以将应用程序中的所有代码编写为单个代码   有线程,让Vert.x担心线程和扩展。没有   更加担心同步和不稳定,你也   避免许多其他竞争条件和死锁案例如此普遍   在进行手工卷制的“传统”多线程应用时   发展“。

唯一的例外是如果您使用的是multi-threaded worker verticle,您很可能不是,而且很可能不需要。

如果你在方法中产生一个新线程,你需要问问自己为什么?这在Vert.x中几乎总是不受欢迎的。如果您需要某种形式的parallelism,请考虑将您的“工作”发送到EventBus并进行其他Verticle处理 - 设置number of instances作业处理verticles你要运行的并行进程的数量。