У меня есть два синхронизированных метода, и я использую шаблон проектирования медиатора. Я пытаюсь избежать тупиков, которые (из того, что я понимаю), например, когда поток имеет блокировку переменной 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