首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过运行对象的同步方法来获取对象的锁

通过运行对象的同步方法来获取对象的锁
EN

Stack Overflow用户
提问于 2014-06-18 16:46:31
回答 1查看 33关注 0票数 0

运行同步方法会将其对象的锁提供给调用该方法的方法。

this Q的代码中,我需要在object c本身或任何其他地方同步块吗?

setInt()是一种同步方法。

在队伍中

代码语言:javascript
复制
c.setInt(c.getInt()+k); 

当调用setInt()时,会获得c的锁,因为setInt()是同步的,并且在setInt()返回之前不会释放锁。这就是整个块,不需要同步它(?)

所以,

代码语言:javascript
复制
 c.setInt(c.getInt()+k); 

如果我在下面的代码中注释掉"Line-A“和"Line-B”,仍然是同步的。setInt()在这里是同步的,而getInt()不是:

代码语言:javascript
复制
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
        }  
}

这让我一直很好奇。

提亚

EN

回答 1

Stack Overflow用户

发布于 2014-06-18 16:48:14

你的问题很难理解,但我认为你是在问你是否锁定了那里的整个调用序列,答案是没有。实际上,您放置的内容与以下内容相同:

代码语言:javascript
复制
 int tmp = c.getInt(); // will lock and then unlock c
 tmp += k;
 c.setInt(tmp); // will lock and then unlock c.

这就是为什么为了适当的线程安全,你需要一个增量方法,它在一个同步的块中同时执行get和set。

代码语言:javascript
复制
 c.increment(k);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24281041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档