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 ответа:
Я бы не удивился, если бы это был кто-то, кто видел это:
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 ?? } }
и подумал, что он мог бы сократить количество строк.
Я был бы очень обеспокоен, если бы это было так...
здесь похожий вопрос, и ответ:
замки обеспечивают взаимное исключение -- не больше чем один поток может держать замок в то же время. Замок идентифицируется с определенным объектом пример. Вы создаете новый объект для блокировки каждый раз, и вы у вас нет никакого способа сообщить любой другой поток, чтобы заблокировать его точно тот же экземпляр объекта. Поэтому ваша блокировка бесполезна.