在this Q的代码中,
如果我在某个锁定对象上同步块
而不是对象c
本身,代码正在执行
从我看到的,准确的结果几乎快两倍。代码中的其他所有内容都是相同的:
public void update(SomeClass c) {
Object lock = new Object();
while (<condition-1>) // the conditions here and the calculation of
// k below dont have anything to do
// with the members of c
if (<condition-2>) {
// calculate k here
synchronized (lock) {
c.setInt(c.getInt()+k);
// System.out.println("in "+this.toString());
}
}
}
为什么会这样?
TIA
// =============================
编辑:
通过上面的锁定,线程一个接一个地运行 - 一个线程正在运行整个序列,然后另一个线程接管并运行直到所有seq.is完成&amp;等等。这就是我如何获得准确的结果。为什么会发生这种锁?
答案 0 :(得分:1)
如果从多个线程(具有相同的SomeClass引用)调用update方法并锁定c,则所有线程将排队等待对c对象的锁定。
如果您改为锁定锁定对象,将在每次方法调用时创建一个新的,并且每个线程将同步它自己的锁(可能不是您想要的),从而加快执行速度