gpt4 book ai didi

java - 与 2 个对象进行 block 同步不起作用

转载 作者:行者123 更新时间:2023-11-30 04:39:32 25 4
gpt4 key购买 nike

我正在测试一个代码,其中有 2 个方法,并且每个方法中的一个语句都是同步的。

private final Object obj1 = new Object();
private final Object obj2 = new Object();

public void method1(int result)
{
//there's a loop to create delay

synchronized (obj1){
sum = sum + result;
}

//there's a loop to create delay

}


public void method2(int result)
{
//there's a loop to create delay

synchronized (obj2){
sum = sum - result;
}

//there's a loop to create delay

}

我基本上所做的是将结果添加到总和中,然后减去相同的金额,然后打印总和。所以我的初始和最终金额应该是恒定的。

问题是我不知道为什么当我使用 2 个 diff 对象作为锁时最终金额与初始金额不同。然而,当我使用“this”对象作为两个语句的锁时,它是恒定的。但是使用“this”作为对象并没有比使用同步方法使执行时间更快。

我对同步概念仍然很陌生,因此非常感谢您的帮助。

最佳答案

当您在 synchronize block 中指定一个对象时,该对象就像该 block 的锁一样使用:任何时候只有一个 synchronize block 可以使用锁对象.

当您使用两个不同对象作为锁时,它们会变成两个不同锁:两个线程可以同时锁定它们 - 每个锁一个线程。这解释了结果不一致的原因:两个线程可以同时获取两个单独的锁,并同时修改sum,从而导致计算不正确。

您应该使用单个锁来保护单个资源免遭并发访问。这就是当您使用 this 时会发生的情况;如果您在两个 synchronize block 中使用 obj1obj2 ,也会发生同样的情况,但在这种情况下,对象的用户将无法通过在对象上同步并故意不释放锁,导致您的方法永远阻塞。

关于java - 与 2 个对象进行 block 同步不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646815/

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