Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java线程实现互斥_Java_Multithreading - Fatal编程技术网

用java线程实现互斥

用java线程实现互斥,java,multithreading,Java,Multithreading,我有这个代码,它是互斥算法 turn = 0 // shared control variable while (turn != i); // CS turn = (turn + 1) % n; 我知道线程是如何工作的,但实际上我在java中使用线程方面有点弱,所以请给我一些建议,帮助我理解如何使用java线程在实际代码中转换它 抱歉,我的英语不好互斥通常是通过将方法标记为已同步来以最简单的形式实现的。通过将对象的方法标记为已同步,一次只能有一个线程执行该对象的方法。拥有该方法的

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

turn = 0 // shared control variable    

while (turn != i);

// CS

turn = (turn + 1) % n;
我知道线程是如何工作的,但实际上我在java中使用线程方面有点弱,所以请给我一些建议,帮助我理解如何使用java线程在实际代码中转换它


抱歉,我的英语不好

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

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

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

然后,可以将该可运行实例传递给所需的任意多个线程。由于它们都引用相同的Runnable,对synchronized方法的调用将是互斥的


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

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

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

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

然后,可以将该可运行实例传递给所需的任意多个线程。由于它们都引用相同的Runnable,对synchronized方法的调用将是互斥的


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

这个代码不是互斥的,考虑这个执行-< /p>
  • 线程0输入代码和CS,然后在最后一行将圈数增加到1
  • 线程1在圈数等于1时进入CS,并保持不变
  • 现在线程0返回到第一行,并将turn设置为0,然后与线程1一起进入CS

  • 这个代码不是互斥的,考虑这个执行-< /p>
  • 线程0输入代码和CS,然后在最后一行将圈数增加到1
  • 线程1在圈数等于1时进入CS,并保持不变
  • 现在线程0返回到第一行,并将turn设置为0,然后与线程1一起进入CS

  • 对不起,我现在不能。请参考或抱歉,我现在不能。请参考,或者你的问题是什么?@RalfH好的,但那个问题已经回答了。你的问题是什么?你的问题是什么?@RalfH好的,但这个问题已经得到了回答。你的问题是什么?