多个线程如何执行我的方法?

时间:2013-06-03 10:20:33

标签: java multithreading thread-safety

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

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

3 个答案:

答案 0 :(得分:6)

从字面意义上讲,没有任何东西可以阻止你的方法被执行多次。只有在更高层次上理解,才能确保您的方法的主要逻辑只执行一次。我之所以这么说,是因为有些老师/面试官只是喜欢挑选和与学生/受访者一起玩无意义的心灵游戏。

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

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

答案 1 :(得分:1)

您应该将方法声明为synchronized

public synchronized void someOperation() { 
...
}

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

答案 2 :(得分:1)

使方法同步或使用像

这样的同步块

public void synchronized oneTimeOnly(){}