2013-06-03 25 views
0

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

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

请参阅[Synchonization]上的Java教程(http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html)。 – 2013-06-03 10:22:04

+0

你想让它执行oneTimeOnly还是多于一个线程?或两者? – Djon

+0

想要确保oneTimeOnly只能由一个线程执行请 – germantom

回答

6

在字面意义上,没有什么会阻止你的方法,从因为它是所谓被执行多次。只有在更高层次上理解时,才能确保您的方法的主要逻辑只执行一次。我是这样说的,因为一些老师/采访者只喜欢挑选和与他们的学生/受访者玩无意义的思维游戏。

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

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

+0

谢谢。我仍然有点困惑2线程如何访问该方法虽然.. – germantom

+0

为什么,究竟是什么困扰你?这就是并发编程的本质:两条独立的执行线可能会同时进入相同的方法。 –

+0

+1提及AtomicBoolean – Johannes

1

应声明你的方法​​:

public synchronized void someOperation() { 
... 
} 

这样你就可以确保只有一次一个线程执行的方法的代码,从而确保该标志只设一次由第一个线程调用它,所有其他访问它的线程都会发现它已经设置好了。

1

制造或使用synchronized块样()oneTimeOnly同步

公共无效同步的方法{}

相关问题