java - 对同一类中的不同方法使用同步块(synchronized block)

标签 java multithreading performance synchronization

我正在阅读来自 oracle 的关于多线程的官方教程我遇到了这个例子(假设 c1c2 从未一起使用):

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
      }
    }
}

据说与在同步块(synchronized block)中使用单词 this 相比,通过使用锁 1 和锁 2 有助于减少不必要的阻塞。

但是,我真的不明白这对减少阻塞有何帮助,因为它们彼此不依赖。我有多个线程,每个线程同时运行这两个方法,当我使用锁定对象和 this 关键字时,性能非常相似。

有人可以帮我解释一下这里的困惑吗?喜欢用一个例子来清楚地说明差异。


加入这里的讨论,这个 post也帮助澄清了我的疑惑。关键点:将synchronized放在方法上意味着线程必须在进入该方法之前获取对象实例上的锁

最佳答案

您正在使用两种不同的锁 - 一种用于保护 inc1,另一种用于保护 inc2。这意味着线程 X 可以运行 inc1 而另一个线程正在运行 inc2。如果它们使用相同的锁(无论是 this 还是不同的锁对象),您将无法同时运行它们。因此,至少在理论上,拥有两个不同的锁应该会提高您在这种情况下的性能。

关于java - 对同一类中的不同方法使用同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416814/

相关文章:

java - 使用 Java POI API 将 PDF 文件插入 MSWord

java - Spring Boot - EnableAutoConfiguration 与排除不起作用

java - 如何将环境变量作为命令的一部分传递

multithreading - 为什么使用单个 'turn' 变量的 Peterson 算法的简化不提供进程同步?

java - 在java中进行解锁调用

java.lang.OutOfMemoryError : unable to create new native thread ..在Windows中重新创建

c++ - 为什么使用 std::multiset 作为优先级队列比使用 std::priority_queue 更快?

python - Python 字典的处理成本有多高?

java - JMH 使用 javaagent 进行测试

python - 如何加速矢量叉积计算