【发布时间】:2014-06-18 07:59:03
【问题描述】:
在thisQ的代码中,
如果我在某个锁定对象上同步块
而不是对象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. 完成等等。这就是我得到准确结果的方式。为什么会发生这种情况?
【问题讨论】:
-
你实际上并没有像
lock那样阻塞在一个局部变量中 -
是的——你说得对。在上面的代码中,另一件事是线程一个接一个地运行。这就是我得到准确结果的原因。我会把这个添加到 Q
-
这就是并发错误很难找到和修复的原因。您的代码可以在 99.99% 的时间内产生正确的结果,或者它可以始终在您的系统上产生正确的结果。然后,您将其运送给客户,然后它就消失了。
标签: java multithreading synchronization locking