我很好奇下面会有什么影响:
Object mutex;
... // mutex initialized in constructor etc.
public setMutex(Object mutex) {
synchronized(this.mutex) {
this.mutex = mutex;
}
}
我看过类似的问题提出反对在其他语言中做这种事情的建议但是,没有专门针对Java。我也看到很多关于为什么人们可能想要这样做的问题,因为它似乎是自我挫败的代码。
我的理由是,当调用setMutex()时,我的代码的其他关键部分可能正在使用互斥锁,我不希望在这些关键部分退出之前重新分配互斥锁。因此,与其保持互斥锁保护的完整性有关,在设置互斥锁时,不是为了防止竞争条件。我希望这是有道理的:)
就我个人而言,我认为它应该可以正常工作,但我真的不知道。
编辑:在我输入时删除方法签名中的“synchronized”关键字... musta brainfartet。
答案 0 :(得分:1)
我认为这没有任何有意义的目的。等待“互斥”字段的旧值进入监视器的每个人仍将等待原始对象,新到达者将等待新值。
不明白为什么同步原语的值需要改变。
答案 1 :(得分:1)
这真的很危险。首先,这个同步块根本不会改变它的行为。
另一个使用此同步块的线程(或另一个基于this.mutex的线程),可能在另一个实例上同步,但可能不依赖于线程是否缓存了this.mutex领域。
请参阅volatile