Após o .NET 4.0, um tipo de carregamento seguro e preguiçoso foi fornecido no .NET FrameworkPreguiçoso O Lazy é capaz de operar em um ambiente multithreaded, garantidoGetValueA função é executada apenas uma vez, implementando assimModo singleton
No passado, usávamos bloqueios de julgamento quadrático para implementar padrões singleton ou para utilizar funções de inicialização estáticas de classes Com o tipo Preguiçoso, esse processo é simplificado e o desempenho é melhor
Quando o Lazy é criado, você pode especificar o modo de instalação da thread, atualmente existem dois modos,Somente publicação,Explicaçãoe Publicação
Modo Apenas Publicação
1. Execute a função de inicialização e a encaixe em um sistema internoCaixatipo, resolver o problema do julgamento de valor nulo, se o caso foi criado, ele retornará nulo,O processo é inseguro em relação à thread
2. Determinar se o m_boxed está vazio, m_boxed é o campo salvo por valor, se for igual a vazio, ele é definido como boxed, esse método pode garantir atomicidade,O processo é seguro para fios
3. Se o CreateValue retorna vazio, significa que outros threads já criaram instâncias, então define como instâncias já criadas
4. Marque o método de inicialização como inicializado, o que geralmente ocorre no caso de execução concorrente, e execute o CreateValue várias vezes
Somente publicaçãoO modo é usado com base emIntertravado.CompareExchange, essa classe contém métodos de atomicidadeCAS (Compare and swap)
O CAS é implementado usando instruções atômicas fornecidas pela CPU, e diferentes versões de runtime podem ter implementações diferentes Implementação específica intertravada No método nativo, amigos interessados podem verificar a implementação específica por meio do código coreclr/jvm
Neste modo,Uma função singleton pode ser executada várias vezes, mas no final é garantido que apenas uma instância será obtida
Modo de Exposição e Publicação
Explicaçãoe PublicaçãoModo usado no modoVolátil+Monitor,MonitorÉ simfechaduraA implementação da instrução, a implementação Monitor no código nativo, é um bloqueio pesado
MonitorA suspensão de fila e thread são suportados, o que pode garantir que todo o bloco de método seja executado em estado de thread única
Link original:O login do hiperlink está visível. |