1

嘿,很抱歉在这里问这个问题,但我的讲师不会帮助我回答过去的试卷答案。多个线程如何执行我的oneTimeOnly()方法?我需要采取哪些步骤才能使其线程安全/仅由一个线程执行一次?

public class ExampleClass {
    private volatile boolean flag = false;
    public void someOperation() {
        if(flag != true) {
            oneTimeOnly();
        }
        flag = true;
    }
}
4

3 回答 3

6

从字面意义上讲,没有什么可以阻止您的方法被执行多次。只有在更高层次上理解,你的方法的主要逻辑才能保证只执行一次。我这么说是因为一些老师/面试官只是喜欢吹毛求疵,和他们的学生/被面试者玩毫无意义的心理游戏。

您的方法的问题是两个线程可能同时执行您的方法,并且仅在两者都完成后才设置flag为。true

您可以同步该方法,也可以使用AtomicBoolean可以确保只有一个线程将其设置为 true 的方法。不过,我相信这对于你的课堂作业来说太高级了,所以坚持使用一种syncronized方法。

于 2013-06-03T10:32:19.350 回答
1

您应该将您的方法声明为synchronized

public synchronized void someOperation() { 
...
}

通过这种方式,您可以确保一次只有一个线程正在执行您的方法代码,从而确保该标志仅由调用它的第一个线程设置一次,并且所有其他访问它的线程都会发现它已经设置。

于 2013-06-03T10:28:09.727 回答
1

使方法同步或使用同步块,如

公共无效同步 oneTimeOnly(){}

于 2013-06-03T10:30:19.720 回答