Подтвердить что ты не робот

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

4b9b3361

Ответ 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

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