使用java的线程互斥

时间:2013-02-10 22:01:09

标签: java multithreading

我有这个代码,它是互斥算法

turn = 0 // shared control variable    

while (turn != i);

// CS

turn = (turn + 1) % n;

我知道线程是如何工作的但是我在使用java中的线程方面有点弱,所以请任何建议帮助我理解如何使用java的线程在实际代码中转换它

抱歉我的英文不好

2 个答案:

答案 0 :(得分:3)

通常通过将方法标记为同步来以最简单的形式实现相互排斥。通过将对象的方法标记为synchronized,一次只能有一个线程执行该对象的方法。拥有该方法的对象是监视器。

此外,您可以在代码本身中定义一个synchronized块,并将该对象传递给它作为监视器。

我相信你可以通过定义一个具有你想要的逻辑的Runnable对象,以更简单的方式实现同​​样的目的。如果您想要互斥,请定义同步方法。

然后可以将Runnable实例传递给您需要的尽可能多的线程。由于它们都引用相同的Runnable,因此对synchronized方法的调用将是互斥的。

这不是唯一的方法,但它应该是你所追求的。希望这会有所帮助。

答案 1 :(得分:0)

这段代码并不相互排斥,请考虑执行 -

  1. 线程0输入代码和CS,然后在最后一行增加为1。
  2. 线程1在转弯等于1时进入CS,并保持
  3. 现在线程0回到第一行并设置为0,然后与线程1一起进入CS