переназначить объект синхронизации из синхронизированного предложения? - PullRequest
0 голосов
/ 27 января 2011

Мне любопытно, каковы будут следующие эффекты:

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

Я видел похожие вопросы с советами против подобных действий на других языках, но ничего специально для Java.Я также видел много вопросов о том, почему кто-то, возможно, захотел бы сделать это, поскольку это, казалось бы, саморазрушающийся код.

Мое обоснование заключается в том, что другие критические разделы моего кода могут использовать мьютекс, когда setMutex ()называется, и я не хочу переназначать мьютекс до тех пор, пока эти критические секции не завершатся.Таким образом, речь идет не столько о защите от расы при настройке мьютекса, сколько о сохранении целостности того, что защищает мьютекс.Я надеюсь, что это имеет смысл:)

Лично я думаю, что это должно работать просто отлично, но я действительно не знаю.

РЕДАКТИРОВАТЬ: удалил ключевое слово "synchronized" из сигнатуры метода ...musta brainfartet, пока я печатал.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Это действительно опасно. Во-первых, этот синхронизированный блок вообще не меняет своего поведения.

Другой поток, который использует этот синхронизированный блок (или другой, основанный на this.mutex), будет , вероятно, синхронизироваться в другом экземпляре, но может не зависеть от того, кэшировал ли поток поле this.mutex или нет ,

См. летучий

1 голос
/ 27 января 2011

Я не думаю, что это служит какой-либо значимой цели.Все, кто ожидает ввода старого значения в старое значение поля «мьютекс», будут ожидать исходный объект, а новые поступления будут ожидать нового значения.
Не понимаю, почему значение вашего примитива синхронизациикогда-нибудь нужно будет изменить.

...