繁体   English   中英

我是否正确理解资源分配的概念?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM