gpt4 book ai didi

java - 从同步子句中重新分配同步对象?

转载 作者:行者123 更新时间:2023-12-02 08:24:27 25 4
gpt4 key购买 nike

我很好奇以下内容会产生什么影响:

Object mutex;
... // mutex initialized in constructor etc.
public setMutex(Object mutex) {
synchronized(this.mutex) {
this.mutex = mutex;
}
}

我见过类似的问题,建议不要在其他语言中做这种事情,但是没有专门针对 Java 的。我还看到了很多关于为什么人们可能想要这样做的问题,因为它似乎是 self 挫败的代码。

我的理由是,当调用 setMutex() 时,我的代码的其他关键部分可能正在使用互斥体,并且我不希望在这些关键部分退出之前重新分配互斥体。因此,与其说是为了防止设置互斥体时的竞争条件,不如说是为了维护互斥体所保护内容的完整性。我希望这是有道理的:)

我个人认为它应该工作得很好,但我真的不知道。

编辑:从方法签名中删除了“synchronized”关键字...在我打字时一定是脑残。

最佳答案

那真的很危险。首先,这个同步块(synchronized block)根本不会改变它的行为。

使用此同步块(synchronized block)(或另一个基于 this.mutex 的线程)的另一个线程可能会在另一个实例上同步,但可能不取决于该线程是否缓存了 this.mutex field 。

参见volatile

关于java - 从同步子句中重新分配同步对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812749/

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