java - synchronized(this) 和类的几个同步方法之间的区别

标签 java synchronized

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

相关文章:

java - 2个线程如何同时访问一个同步块(synchronized block)?

java - 在 Java 中使用 XSLT 将 XML 转换为 HTML 字符串

java - 如何在 Aeron 库中创建多目标转换

java - sqldeveloper 错误信息 : Network adapter could not establish the connection error

Java、转账服务和并发问题

java - 如何Junit测试一个同步对象不能同时被两个线程访问?

java - java中的同步和代码重新排序

java - 为什么我会陷入 java 中的超长 for 循环?

java - 如何使用动态键名解析 JSON?

java - volatile 数组的替代品