并发Java:如何避免方法在循环中被调用两次
这就是我的情况:
我有一个循环
在这个循环中,我需要验证一个条件
如果条件已验证,则调用2个方法(这些方法只需调用一次)
由于应用程序有奇怪的行为,我怀疑循环太快,可能会多次调用这些方法
请问如何避免这个
@Override
public void loop() {
Thread.sleep(1000);
if (thisIsTrue()) { //Condition checked
setThisFalse(); //Set the condition above false
thanDoSomethingElse(); //Method to executed ONLY ONCE
}
}
# 1 楼答案
我希望你所说的奇怪行为是指有时没有问题,而在其他时候,状态的随机变化是不可复制的
如果是,那么很可能是由于多个线程同时修改状态而出现问题。在这种情况下,最终结果取决于不可预测的操作时间
您可以同步对“thisIsTrue”方法正在计算的变量的访问,并确保自动检查值和修改值。如果您不熟悉同步结构,可以阅读oracle的java同步教程
# 2 楼答案
由于这被标记为并发,我建议引入synchronized块:
但是,请确保访问或修改
thisIsTrue()
和setThisFalse()
中使用的变量的所有方法也以同步方式访问它。最好重新设计应用程序,引入一种检查和修改变量的方法另一种选择是使用AtomicBoolean.compareAndSet() [Oracle]
# 3 楼答案
您可以使用AtomicBoolean来保护方法调用
下面是一个示例代码:
如果同时调用您的方法的线程数很高,那么这可能会执行得很差