Por que o object de bloqueio precisa ser estático?

É muito comum usar um object readonly estático privado para bloqueio em multi-threading. Eu entendo que private reduz os pontos de input para o object de bloqueio, apertando o encapsulamento e, portanto, o access ao mais essencial.

Mas por que estática?

private static readonly object Locker = new object(); 

No final, o campo é usado apenas dentro da minha class, e eu também poderia usar isso:

 private readonly object Locker = new object(); 

Algum comentário?

ATUALIZAR:

Como exemplo, colei este código (apenas um exemplo). Eu poderia usar um armário estático ou não estático e ambos funcionariam bem. Considerando a resposta abaixo, eu deveria estar definindo meu armário como este? (Desculpe eu tenho uma entrevista na próxima semana e preciso saber cada detalhe 🙂

 private readonly object Locker = new object(); 

E aqui está o código:

  private int _priceA; private int _priceB; private EventWaitHandle[] _waithandle; private readonly IService _service; //ctor public ModuleAViewModel(IService service) { _service = service; _modelA = new ModelA(); _waithandle = new ManualResetEvent[2]; _waithandle[0] = new ManualResetEvent(false); _waithandle[1] = new ManualResetEvent(false); LoadDataByThread(); } private void LoadDataByThread() { new Thread(() => { new Thread(() => { lock (Locker) { _priceA = _service.GetPriceA(); } _waithandle[0].Set(); }).Start(); new Thread(() => { lock (Locker) { _priceB = _service.GetPriceB(); } _waithandle[1].Set(); }).Start(); WaitHandle.WaitAll(_waithandle); PriceA = _priceA; PriceB = _priceB; }).Start(); } 

obrigado

Não é “muito comum usar um object de somente leitura estático privado para bloquear em vários segmentos” – em vez disso, é comum usar um bloqueio na granularidade apropriada / escolhida . Às vezes isso é static . Mais frequentemente, IMO, não é – mas é baseado em instâncias .

A hora principal em que você vê um bloqueio static é para um cache global ou para carregamento diferido de dados / singletons globais. E no último, há maneiras melhores de fazer isso de qualquer maneira .

Então, isso realmente depende: como o Locker é usado no seu cenário? É proteger algo que é em si estático? Se assim for, o bloqueio deve ser estático. Se estiver protegendo algo baseado em instância , o bloqueio IMO também deve ser baseado em instância.

Não precisa ser estático, na verdade às vezes não deve ser estático.

A variável deve viver no mesmo escopo dos methods em que você a usa para bloqueio. Se os methods forem estáticos, a variável deverá ser estática e, se os methods forem methods de instância, a variável deverá ser uma instância variável.

Uma variável estática ainda funcionará quando usada para bloquear um método de instância, mas você estará bloqueando demais. Você bloqueará todos os methods em todas as instâncias, não apenas os methods na mesma instância.

O escopo e o tempo de vida de um bloqueio podem / devem depender da ‘coisa’ que você deseja bloquear. Os bloqueios estáticos são usados ​​principalmente para bloquear itens estáticos.