0

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

turn = 0 // shared control variable    

while (turn != i);

// CS

turn = (turn + 1) % n;

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

对不起,我的英语不好

4

2 回答 2

4

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

此外,您可以在代码本身中定义一个同步块,将对象传递给它以充当监视器。

我相信您可以通过定义一个具有您想要完成的逻辑的 Runnable 对象以更简单的方式实现相同的目标。在需要互斥的地方,定义一个同步方法。

然后可以将该 Runnable 实例传递给您需要的任意数量的线程。由于它们都引用同一个 Runnable,因此对同步方法的调用将是互斥的。

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

于 2013-02-10T22:09:37.347 回答
0

此代码不是互斥的,请考虑此执行-

  1. 线程 0 输入代码和 CS,然后在最后一行递增 turn 到 1。
  2. 线程 1 在轮数等于 1 时进入 CS,并停留
  3. 现在线程 0 回到第一行并将 turn 设置为 0,然后与线程 1 一起进入 CS
于 2013-02-12T16:49:51.223 回答