Problemas de segurança de encadeamento (reordenação de instruções)

conceito

        É um método de otimização do compilador. Sob a premissa de garantir que a lógica de execução original permaneça inalterada, a ordem de execução do código é ajustada para melhorar a eficiência de execução após o ajuste. No caso de thread único, essa otimização geralmente não causar problemas. Mas não necessariamente no caso de multithreading

exemplo

SingletonLazy instance=new SingletonLazy();

        Por exemplo, a instanciação de um objeto instância pode ser simplesmente dividida em três passos: 1. Criar um espaço de memória para o objeto e obter o endereço de memória 2. Chamar o método de construção no espaço para inicializar o objeto. 3. Atribua o endereço de memória à referência de instância

        A sequência de execução normal deve ser 1, 2, 3, mas o compilador pode otimizar a sequência para 1, 3, 2. Em multi-threading, se o agendamento de thread ocorrer no meio de 3, 2, ou seja, o objeto não foi inicializado ainda. , mas a instância já obteve o endereço de memória, neste momento a segunda thread julga a instância! =null, então retorna a instância, e também pode usar algumas propriedades e métodos na instância, mas o objeto instância obtido neste momento está incompleto e não foi inicializado, portanto, quando você chama esse objeto, alguns questionam

Solução

 private static volatile SingletonLazy instance=null;

        Ao declarar a instância, adicione a palavra-chave volátil, para que o compilador não otimize a reordenação da instrução para a criação do objeto instância, resolvendo assim o problema da reordenação da instrução

Supongo que te gusta

Origin blog.csdn.net/q322359/article/details/131981125
Recomendado
Clasificación