oneTimeOnly()
方法?我需要采取哪些步骤才能使其线程安全/仅由一个线程执行一次?
public class ExampleClass {
private volatile boolean flag = false;
public void someOperation() {
if(flag != true) {
oneTimeOnly();
}
flag = true;
}
}
答案 0 :(得分:6)
从字面意义上讲,没有任何东西可以阻止你的方法被执行多次。只有在更高层次上理解,才能确保您的方法的主要逻辑只执行一次。我之所以这么说,是因为有些老师/面试官只是喜欢挑选和与学生/受访者一起玩无意义的心灵游戏。
您的方法存在的问题是两个线程可能同时执行您的方法,并且仅在完成后才将flag
设置为true
。
您可以同步该方法,也可以使用AtomicBoolean
来确保只有一个线程将其设置为true。我相信这对于你的课程作业来说太先进了,所以坚持使用syncronized
方法。
答案 1 :(得分:1)
您应该将方法声明为synchronized
:
public synchronized void someOperation() {
...
}
通过这种方式,您可以确保一次只有一个线程正在执行方法的代码,从而确保该标志仅由调用它的第一个线程设置一次,而访问它的所有其他线程将发现它已经设置
答案 2 :(得分:1)
使方法同步或使用像
这样的同步块public void synchronized oneTimeOnly(){}