在 Programming Interviews Exposed 书(Wrox 出版物)中,生产者消费者问题的代码对名为 IntBuffer 的类中的每个 produce() 和 consume() 方法都使用了“synchronized”关键字。这与在每个方法中使用 synchronized(this) 不同吗?书上说,“当一个线程忙于等待produce()时,没有线程可以进入consume(),因为方法是同步的”。我觉得这对书中的代码没有意义,因为当一个线程忙于等待 produce() 时,没有线程可以进入 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;
}
}
最佳答案
不,它们是一样的。
private synchronized void foo() {}
private void foo2() {
synchronized(this){
}
}
它们将做完全相同的事情,因为它们都监视调用它们的实例。
可以在 Jakob Jenkov 的博客中找到一个很好的教程 http://tutorials.jenkov.com/java-concurrency/synchronized.html#java-synchronized-example
编码愉快!
关于java - synchronized(this) 和类的几个同步方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44400966/