gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:43:51 25 4
gpt4 key购买 nike

运行同步方法会将其对象的锁授予调用该方法的对象。

代码中this问,我是否需要在对象 c 本身或其他任何东西上同步该 block ?

setInt() 是一个同步方法。

在行

c.setInt(c.getInt()+k); 

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

所以,

 c.setInt(c.getInt()+k); 

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

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
}
}

这让我一直很好奇。

TIA

最佳答案

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

 int tmp = c.getInt(); // will lock and then unlock c
tmp += k;
c.setInt(tmp); // will lock and then unlock c.

这就是为什么为了正确的线程安全性,您需要一种增量方法,该方法在一个同步块(synchronized block)内执行 get 和 set 操作。

 c.increment(k);

关于java - 通过运行对象的同步方法来获取对象的锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24281041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com