我正在阅读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++;
}
}
}
}
据说通过使用锁1&锁定2,与在同步块中使用单词this相比,它有助于减少不必要的阻塞。
然而,我并没有真正看到这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程,每个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。
有人可以帮我解释一下我的困惑吗?喜欢用一个例子来看解释清楚地说明差异。
在这里继续讨论,这个post也有助于澄清我的疑虑。关键点:对方法进行同步意味着线程必须在输入该方法之前获取对象实例上的锁
答案 0 :(得分:3)
您正在使用两个不同的锁定 - 一个用于保护inc1
,另一个用于保护inc2
。这意味着线程X可以运行inc1
而另一个线程正在运行inc2
。如果他们使用相同的锁(无论它是this
还是不同的锁对象),您将无法同时运行它们。因此,至少在理论上,拥有两个不同的锁应该可以提高您在这种情况下的表现。