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 ())? Это не должно иметь никакого эффекта, поскольку он всегда блокируется на другом объекте, но этот вид блокировки является постоянным во всем коде, даже в некопированных и вставленных частях. Это какой-то особый случай в языке C#, который компилируется в то, о чем я не знаю, или программист просто принял какой-то культ груза, который работал некоторое время назад?

3 85

3 ответа:

Я бы не удивился, если бы это был кто-то, кто видел это:

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 ??
    }
}

и подумал, что он мог бы сократить количество строк.

Я был бы очень обеспокоен, если бы это было так...

здесь похожий вопрос, и ответ:

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

Это, наверное, бесполезно. Но есть шанс, что он там, чтобы создать барьер памяти. Не уверен, что c# блокирует elision или если он сохраняет семантику упорядочения блокировки.