首页 > 解决方案 > Java - 同步无助于互斥

问题描述

我有一个程序,其中Main该类将创建很少的Node类资源,其中包含一个可运行线程,该线程在Node创建类资源时执行。我有一个类使用的共享资源ReceiveNode。但是当几个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:22:2 1:1但永远不会像1:2:21

标签: javasynchronization

解决方案


您的每个线程都创建自己的ReceiveResource对象(我猜Receive您的意思是类ReceiveResource?)并调用rcv()自己的对象。

线程不会相互同步,因为它们正在调用rcv()不同的ReceiveResource. ReceiveResource如果您希望调用是互斥的,则需要它们都使用相同的对象。


推荐阅读