在《 Programming Interviews Exposed》(Wrox出版物)中,针对Producer使用者问题的代码在称为IntBuffer的类中为produce()和consume()方法中的每一个使用“ synchronized”关键字。这与在每个方法中使用synced(this)不同吗?该书说:“当线程忙于在Produce()中等待时,因为方法是同步的,所以没有线程可以进入消耗()。”我认为这对书中的代码没有意义,因为当线程正在等待Produce()时,没有线程可以进入Produce()。但是,其他线程可以进入消耗(),这破坏了互斥的想法。生产和使用方法都应该完全同步对吗?
书中的代码:
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;
}
}
最佳答案
不,它们是相同的。
private synchronized void foo() {}
private void foo2() {
synchronized(this){
}
}
它们将与监视从其调用的实例完全相同。
可以在Jakob Jenkov的博客中找到一个很好的教程
http://tutorials.jenkov.com/java-concurrency/synchronized.html#java-synchronized-example
编码愉快!