运行synchronized方法会将其对象锁定为调用该方法的对象。
在this Q的代码中,
我是否需要根据对象c
本身或其他任何内容同步块?
setInt()
是一种同步方法。
在第
行c.setInt(c.getInt()+k);
调用setInt()
时,c
锁定setInt()
,因为setInt()
同步并且
锁定在 c.setInt(c.getInt()+k);
返回之前未被释放。这是整个块,不需要同步(?)
所以,
public void update(SomeClass c) {
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 (c) { // Line-A
c.setInt(c.getInt()+k);
// System.out.println("in "+this.toString());
} // Line-B
}
}
如果我发表评论&#34; Line-A&#34; 仍会同步&安培; &#34;线-B&#34;在以下代码中。 setInt()在这里同步,getInt()isn&#39; t:
{{1}}
这让我一直很好奇。
TIA
答案 0 :(得分:2)
你的问题很难理解,但我想你问的是你是否因为完整的通话顺序而被锁定,答案是你不是。实际上,你所做的就是:
int tmp = c.getInt(); // will lock and then unlock c
tmp += k;
c.setInt(tmp); // will lock and then unlock c.
这就是为什么为了正确的线程安全,你需要一个递增方法,它在一个同步块中同时执行get和set。
即。
c.increment(k);