尽管以下是众所周知的话题,我希望你的想法。 我写了一个小程序如下:所有的生产者都排队,也是消费者。我无法理解为什么是这样。什么情况下它可以完全阻止。生产者/消费者和调试死锁的原因
让我们考虑生产者/消费者正在等待阵列上的锁以及使消费者/生产者退出同步块的原因。我的意思是它必须缓慢移动,但不可能发生僵局。我相信。
这里我有两个问题: 1.什么情况下发生死锁。 2.如何理解引擎盖下发生了什么。我的意思是如何调试。
public class ProducerConsumer implements Runnable {
boolean producer = false;
private volatile int i = 0;
int[] array = new int[10];
public static String getThreadName() {
return Thread.currentThread().getName();
}
public void producer() {
try {
synchronized (array) {
while (i > 9) {
System.out.println("Producer of " + getThreadName()
+ " is waiting i " + i);
array.wait();
System.out.println("Producer of " + getThreadName()
+ " came out of sleep i " + i);
}
System.out.println("Producer of " + getThreadName()
+ " in synchronized block i" + i);
array[i] = generateRandom();
System.out.println("Producer of " + getThreadName()
+ " inserted in array " + array[i] + " index " + i);
i++;
array.notifyAll();
}
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("Producer of " + getThreadName()
+ " interrupted " + e);
}
}
public void consumer() {
try {
synchronized (array) {
while (i < 0) {
System.out.println("Consumer of " + getThreadName()
+ " is waiting i " + i);
array.wait();
System.out.println("Consumer of " + getThreadName()
+ " came out of sleep i " + i);
}
System.out.println("Consumer of " + getThreadName()
+ " in synchronized block extracted value " + array[i]
+ " of index " + i);
i--;
array.notifyAll();
}
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("Consumer of " + getThreadName()
+ " interrupted " + e);
}
}
public static int generateRandom() {
Random random = new Random();
return random.nextInt(10);
}
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();
for (int i = 0; i < 4; i++) {
if (i % 2 == 0)
new Thread(pc, "producer thread").start();
else {
new Thread(pc, "consumer thread").start();
}
}
}
public void run() {
while (true) {
if (getThreadName().equalsIgnoreCase("producer thread")) {
producer();
} else {
consumer();
}
}
}
}
它击中如下输出:
Consumer of consumer thread in synchronized block extracted value 0 of index 0
Producer of producer thread in synchronized block i-1
Producer of producer thread in synchronized block i-1
Consumer of consumer thread is waiting i -1
Consumer of consumer thread is waiting i -1
是的你是对的。我在数组上同步并等待其他对象。谢谢。 – Curious
看来你编辑你的代码 - 改变Thread.sleep()等待()。它也不会起作用 - 来自produce()的wait()首先被调用,而来自consume()的notify()永远不会被调用。 – kostya
没有例外,现在我改变了等待并通知上面编辑的数组对象。仍然是同样的僵局。 – Curious