我正在阅读来自 oracle 的关于多线程的官方教程我遇到了这个例子(假设 c1
和 c2
从未一起使用):
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/