在《 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

编码愉快!

08-16 16:41