在《编程面试揭秘》(Wrox出版社)一书中,生产者消费者问题的代码在名为IntBuffer的类中,对于每个produce()和consume()方法都使用了'synchronized'关键字。这与在这些方法中使用'synchronized(this)'有什么不同吗?该书指出,“当一个线程在produce()中忙于等待时,没有线程可以进入consume(),因为这些方法是同步的。”我觉得这不符合书中代码的逻辑,因为当一个线程在produce()中忙于等待时,其他线程可以进入consume(),这破坏了互斥的概念。所以,应该将produce和consume方法都完全同步才对。
public class IntBuffer
{
private int index;
private int[] buffer = new int[8];
// Function called by producer thread
public synchronized void produce(int num) {
while(index == buffer.length - 1) {
try { wait();}
catch(InterruptedException ex) {}
}
buffer[index++] = num;
notifyAll();
}
// Function called by consumer thread
public synchronized int consume() {
while(index == 0) {
try { wait();}
catch(InterruptedException ex) {}
}
int ret = buffer[--index];
notifyAll();
return ret;
}
}
synchronized
会像synchronized(this)
块一样在this
对象上进行同步。它不会在方法或其他任何地方进行同步。 - user2357112synchronized
方法在其执行之前会获取一个监视器。对于实例方法,将使用与this
(调用该方法的对象)关联的监视器。 - Radiodef