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:2
或2:2 1:1
,但决不能是1:2:21
# 1 楼答案
每个线程都会创建自己的
ReceiveResource
对象(我猜类Receive
的意思是ReceiveResource
?)并对自己的对象调用rcv()
这些线程不会相互同步,因为它们在
ReceiveResource
的不同实例上调用rcv()
。如果希望调用相互排斥,则需要它们都使用相同的ReceiveResource
对象# 2 楼答案
您正在锁定对象级别,并创建两个不同的
Receive
-对象。这两个Receive
对象不会相互同步,只会与自身同步。如果要使两个Receive
对象彼此同步,它们必须锁定在同一个对象上。在下面的代码中,我创建了一个对象_lockObject
。这个变量是静态的,这意味着它在所有Receive
-对象上共享请尝试以下代码:
附言:
此代码:
相当于: