在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());
}
}
} 为什么会这样呢?
提亚
//=
编辑:
使用上面的锁,线程一个接一个地运行--一个线程运行整个序列,然后另一个线程接管并运行,直到所有seq.is完成&以此类推。这就是我得到准确结果的方法。为什么这个锁会发生这种情况?
发布于 2014-06-18 16:05:16
如果您从多个线程(具有相同的SomeClass引用)调用更新方法并锁定c,那么所有线程都将排队等待锁定c对象。
如果改为锁定锁对象,那么每次调用方法时都会创建一个新的锁,每个线程都会在自己的锁上进行同步(可能不是您想要的),从而加快了执行速度
https://stackoverflow.com/questions/24280044
复制相似问题