有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java同步无助于相互排斥

我有一个程序,其中Main类将创建Node类的一些资源,该类包含一个可运行的线程,该线程在创建Node类的资源时执行。我有一个共享资源Receive类,它是Node类使用的。但是当两个Node资源从资源类到达同步方法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


共 (2) 个答案

  1. # 1 楼答案

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

    这些线程不会相互同步,因为它们在ReceiveResource的不同实例上调用rcv()。如果希望调用相互排斥,则需要它们都使用相同的ReceiveResource对象

  2. # 2 楼答案

    您正在锁定对象级别,并创建两个不同的Receive-对象。这两个Receive对象不会相互同步,只会与自身同步。如果要使两个Receive对象彼此同步,它们必须锁定在同一个对象上。在下面的代码中,我创建了一个对象_lockObject。这个变量是静态的,这意味着它在所有Receive-对象上共享

    请尝试以下代码:

    public class Receive
    {
        private static Object _lockObject = new Object();
    
        public void rcv(int index)
        {
            synchronized(_lockObject)
            {
                System.out.print(index+":");
                System.out.print(index);
            }
        }
    }
    

    附言:

    此代码:

    public synchronized void rcv()
    {
         ...
    }
    

    相当于:

    public void rcv()
    {
        synchronized(this)
        {
            ....
        }
    }