我有兩個同步的方法,我使用中介設計模式。 我試圖避免死鎖,這是(據我所知)例如,當一個線程鎖定變量res1但鎖定變量res2時。另一個線程需要res1的鎖,但對res2有鎖 - 導致死鎖,對吧?同步方法,以避免死鎖
假設我對死鎖的理解是正確的,那麼我的問題是我是否已經解決了這個代碼中的死鎖問題?
我有兩個同步的方法和兩個線程。
public class Producer extends Thread {
private Mediator med;
private int id;
private static int count = 1;
public Producer(Mediator m) {
med = m;
id = count++;
}
public void run() {
int num;
while(true) {
num = (int)(Math.random()*100);
med.storeMessage(num);
System.out.println("P-" + id + ": " + num);
}
}
}
public class Consumer extends Thread {
private Mediator med;
private int id;
private static int count = 1;
// laver kopling over til mediator
public Consumer(Mediator m) {
med = m;
id = count++;
}
public void run() {
int num;
while(true) {
num = med.retrieveMessage();
System.out.println("C" + id + ": " + num);
}
}
}
public class Mediator {
private int number;
private boolean slotFull = false;
public synchronized void storeMessage(int num) {
while(slotFull == true) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
slotFull = true;
number = num;
notifyAll();
}
public synchronized int retrieveMessage() {
while(slotFull == false) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
slotFull = false;
notifyAll();
return number;
}
}
public class MediatorTest {
public static void main(String[] args) {
Mediator mb = new Mediator();
new Producer(mb).start();
new Producer(mb).start();
new Producer(mb).start();
new Consumer(mb).start();
new Consumer(mb).start();
}
}
謝謝:) 我過幾天有一個考試,我打算在描述如何解決僵局。它需要很好的設計,但我認爲它看起來像上面提到的代碼。 你知道如何解決死鎖嗎?我在想也許是一個理論上的解釋? – Charles