【发布时间】:2016-09-21 20:35:59
【问题描述】:
我正在阅读来自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++;
}
}
}
}
据说通过使用lock 1 & lock 2,相比在同步块中使用this这个词,它有助于减少不必要的阻塞。
但是,我真的不明白这如何有助于减少阻塞,因为它们彼此不依赖。我有多个线程,每个线程同时运行这两种方法,当我使用锁定对象和 this 关键字时,性能相当相似。
有人可以在这里帮助解释我的困惑吗?喜欢看一个例子的解释,以清楚地说明差异。
除了这里的讨论之外,post 也有助于澄清我的疑问。关键点:在方法上设置同步意味着线程必须在进入该方法之前获取对象实例上的锁
【问题讨论】:
-
要查看这种情况下的性能差异,您必须使用大量线程随机并发地调用您的 2 个方法进行大量调用。但是,如果调用不仅仅是增加一个变量,那么 1 与 2 锁之间的差异会更加明显。
标签: java multithreading performance synchronization