Я просматриваю код, написанный консультантом, и, хотя уже появились десятки красных флажков, я не могу осмыслить следующий фрагмент:
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 #, который скомпилирован для чего-то, о чем я не знаю, или программист просто принял какой-то культ карго, который работал некоторое время назад?
c#
thread-safety
locking
Чарльз
источник
источник
new object()
хранилось в поле, и это поле использовалось вlock()
операторах, и они не знали, что лучше не вставлять его.lock
код совершенно бесполезенОтветы:
Я бы не удивился, если бы это увидел кто-нибудь:
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 # блокирует исключение или сохраняет ли он семантику упорядочения блокировки.
источник