从synchronized子句中重新分配synch对象?

时间:2011-01-27 04:28:17

标签: java synchronization mutex

我很好奇下面会有什么影响:

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

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

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

就我个人而言,我认为它应该可以正常工作,但我真的不知道。

编辑:在我输入时删除方法签名中的“synchronized”关键字... musta brainfartet。

2 个答案:

答案 0 :(得分:1)

我认为这没有任何有意义的目的。等待“互斥”字段的旧值进入监视器的每个人仍将等待原始对象,新到达者将等待新值。
不明白为什么同步原语的值需要改变。

答案 1 :(得分:1)

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

另一个使用此同步块的线程(或另一个基于this.mutex的线程),可能在另一个实例上同步,但可能不依赖于线程是否缓存了this.mutex领域。

请参阅volatile