Lock (new object()) - Культурный культ или какой-то сумасшедший "языковой особый случай"?
Я просматриваю код, написанный консультантом, и, когда уже появились десятки красных флагов, я не могу обернуть вокруг следующего фрагмента:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Что здесь делает lock (new object())? Не должен иметь никакого эффекта, поскольку он всегда блокирует другой объект, но такая блокировка сохраняется во всем коде, даже в не скопированных и вставленных частях. Это какой-то особый случай на языке С#, который скомпилирован к чему-то, о чем я не знаю, или попросил программиста принять некоторый кусок груза, который когда-то работал?
Ответы
Ответ 1
Я бы не удивился, если бы кто-то увидел это:
private readonly object lockObj = new object();
private void MyMethod()
{
lock(lockObj)
{
// do amazing stuff, so amazing it can only run once at a time
// e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
}
}
и подумал, что он может сократить количество строк.
Я был бы очень обеспокоен, если бы это было так, хотя...
Ответ 2
Здесь аналогичный вопрос и ответ:
Замки обеспечивают взаимное исключение - не более одного потока может блокировка в одно и то же время. Блокировка идентифицируется определенным объектом пример. Вы создаете новый объект для блокировки каждый раз, и вы не имеют способа сообщить какой-либо другой поток, чтобы тот же экземпляр объекта. Поэтому ваша блокировка бесполезна.
Ответ 3
Это, вероятно, бесполезно. Но есть шанс создать барьер памяти. Не уверен, что С# блокирует эликсир, или если он делает, сохраняет ли он семантику упорядочения блокировки.