【发布时间】:2016-05-02 02:37:43
【问题描述】:
对于 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 的节点表示该进程已锁定资源。
我理解正确吗? 欢迎任何帮助。 谢谢。
【问题讨论】:
标签: java process resources deadlock synchronized