Estou revisando um código escrito por um consultor e, embora dezenas de sinalizadores vermelhos já tenham surgido, não consigo entender o seguinte snippet:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
O que lock (new object ()) está fazendo aqui? Não deve ter nenhum efeito, pois está sempre travando em outro objeto, mas esse tipo de travamento é persistente em todo o código, mesmo em partes não copiadas e coladas. É algum caso especial na linguagem C # que é compilado para algo que eu não conheço, ou o programador simplesmente adotou algum culto ao cargo que funcionou algum tempo atrás?
c#
thread-safety
locking
Charles
fonte
fonte
new object()
estava armazenado em um campo e esse campo foi usado naslock()
declarações, e eles não sabiam que era melhor não embuti-lo.lock
código é totalmente inútilRespostas:
Eu não ficaria surpreso se fosse alguém que visse isso:
e pensei que poderia cortar o número de linhas.
Eu ficaria muito preocupado se fosse esse o caso ...
fonte
Aqui está uma pergunta e resposta semelhante:
fonte
Provavelmente é inútil. Mas existe uma chance remota de criar uma barreira de memória. Não tenho certeza se o c # bloqueia a elisão ou se preserva a semântica de ordenação do bloqueio.
fonte