通过摩擦其同步方法获取对象的锁定

时间:2014-06-18 08:46:31

标签: java multithreading synchronization locking

运行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

1 个答案:

答案 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);