java - Java - 同步无助于互斥
问题描述
我有一个程序,其中Main
该类将创建很少的Node
类资源,其中包含一个可运行线程,该线程在Node
创建类资源时执行。我有一个类使用的共享资源Receive
类Node
。但是当几个Node
资源从 Resource 类到达同步方法rcv()
时,程序不会考虑互斥,并且输出是来自不同Node
类的不同部分的混合物
public class Main
{
//field
//methods
public static void main(String[] main)
{
Node node1 = new Node(1);
Node node2 = new Node(2);
}//main
}
节点类
public class Node
{
private int index;
public Node(int index)
{
this.index = index;
receive();
}
public void receive()
{
(new Thread() {
@Override
public void run()
{
Receive r = new Receive();
r.rcv(index);
}//run method
}).start();
}//send method
}
接班
public class Receive
{
synchronized public void rcv(int index)
{
System.out.print(index+":");
System.out.print(index);
}
}
输出应该是1:1 2:2
或2:2 1:1
但永远不会像1:2:21
解决方案
您的每个线程都创建自己的ReceiveResource
对象(我猜Receive
您的意思是类ReceiveResource
?)并调用rcv()
自己的对象。
线程不会相互同步,因为它们正在调用rcv()
不同的ReceiveResource
. ReceiveResource
如果您希望调用是互斥的,则需要它们都使用相同的对象。
推荐阅读
- python-3.x - Python - 如何对元组和列表的元组进行排序
- mysql - 加入最新值的数据表,如果没有找到显示空mysql?
- css - 如何删除背景视频的侧边栏并适合全屏
- algorithm - 如何在由升序数组和降序数组组成的数组中找到最大数
- acumatica - 移动到扩展库
- c++ - 何时忽略代码块以进行代码覆盖
- python - 如何使用request.Post在python中上传文件
- java - REST 调用调用 jax rs 和 Spring 中的另一个 REST 调用
- azure-web-app-service - Process.env.APPSEETING_MyAppSetting 在 Angular 8 中未定义为 Azure 上的 webAPP
- android - 如何使用詹金斯生成签名的应用程序包?