[英]Am I understanding the concept of resource allocation correctly?
我对同步在Java中如何进行资源分配感到困惑。 当我得到以下Java代码时:
import java.util.concurrent.Semaphore;
public class Deadlock {
public Deadlock () {
Semaphore mutex[] = new Semaphore[4];
for (int i = 0; i < 4; i++)
mutex[i] = new Semaphore(1);
A threadA = new A(mutex);
B threadB = new B(mutex);
C threadC = new C(mutex);
threadA.start();
threadB.start();
threadC.start();
}
private class A extends Thread {
private Semaphore[] resource;
public A(Semaphore[] m) {
resource = m;
}
public void run() {
System.out.println("A started");
synchronized( resouce[1] ) {
System.out.println("A locks rsc 1");
synchronized (resource[0]) {
System.out.println("A locks rsc 0");
}
}
System.out.println("A finished");
}
}
private class B extends Thread {
private Semaphore[] resource;
public B(Semaphore[] m) {
resource = m;
}
public void run() {
System.out.println("B started");
synchronized( resouce[3] ) {
System.out.println("B locks rsc 3");
synchronized (resource[0]) {
System.out.println("B locks rsc 0");
synchronized (resource[2]) {
System.out.println("B locks rsc 2");
}
}
}
System.out.println("B finished");
}
}
private class C extends Thread {
private Semaphore[] resource;
public C(Semaphore[] m) {
resource = m;
}
public void run() {
System.out.println("C started");
synchronized( resouce[2] ) {
System.out.println("C locks rsc 2");
synchronized (resource[1]) {
System.out.println("C locks rsc 1");
}
}
System.out.println("C finished");
}
}
}
据我了解,当线程A启动时,线程A锁定了资源1和资源0。因此,当线程B启动时,它将获得对资源3的锁定,但将等待资源0从线程A释放。线程B在资源0上没有锁定,将无法在资源2上等待。线程C启动时,它将在资源2上具有锁定,但也等待资源1从线程A释放。
这里,从P到R的节点是指对资源的请求处理。 从R到P的节点表示该进程已锁定资源。
我理解正确吗? 欢迎任何帮助。 谢谢。
线程B启动时,它将获取对资源3的锁定,但将等待资源0从线程A释放
嗯,但是假设A
仍在运行。 它可能已经完成,甚至可能还没有开始。 达到死锁状态的机会可能仅发生于运行的千分之一中。 这就是线程异步并发运行的本质。 很难预测它们的精确行为。
另外,通过调用也正在同步的System.out.println(...)
使事情变得复杂。 这将引发您的测试并改变比赛条件。
我理解正确吗?
我认为您正在适当地理解资源图,而不是在正确的时间达到完美的死锁点有多困难。
要尝试的一件事是在while(true)
循环中执行以下操作。
while (true) {
A threadA = new A(mutex);
B threadB = new B(mutex);
C threadC = new C(mutex);
threadA.start();
threadB.start();
threadC.start();
threadA.join();
threadB.join();
threadC.join();
}
在某个时候,输出将停止,CPU将变为0,您将知道它已经达到死锁状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.