Prefácio
Este artigo tenta explorar referências fracas em Java a partir das perspectivas de quê, por que e como ajudar todos a entender as definições, cenários básicos de uso e métodos de uso de referências fracas em Java.
1. O que-o que é uma citação fraca?
Referências fracas em Java consulte especificamente java.lang.ref.WeakReference<T> . Vamos primeiro olhar para a documentação oficial explica:
A existência de um objeto de referência fraco não impede que o objeto que ele aponta seja reciclado pelo coletor de lixo. O uso mais comum de referências fracas é implementar mapeamentos canônicos (como tabelas de hash).
Supondo que o coletor de lixo decida que um objeto é fracamente acessível em um determinado momento (ou seja, todos os pontos atuais para ele são referências fracas), o coletor de lixo limpará todas as referências fracas ao objeto e depois marcará o fraco objeto acessível como finalizável, para que seja reciclado mais tarde. Ao mesmo tempo ou posterior, o coletor de lixo colocará as referências fracas recém -limpas na fila de referência especificadas ao criar o objeto de referência fraco.
De fato, existem quatro tipos de referências em Java, que são de forte a fraca: referência forte , referência suave , referência fraca e referência virtual .
Abaixo, apresentamos brevemente três outras citações além de citações fracas:
1. Referência forte: geralmente, a referência que retornamos quando criamos um novo objeto através do novo é uma forte referência. Se um objeto puder ser alcançado através de uma série de referências fortes, ele for fortemente acessível, não será reciclado.
2. Referência suave: A diferença entre referência suave e referência fraca é que, se um objeto for alcançado por uma referência fraca, ele será reciclado, independentemente de a memória atual ser suficiente, enquanto o objeto acessível por uma referência suave será reciclado apenas quando a memória for insuficiente. Portanto, as referências suaves são "mais fortes" do que as referências fracas.
3. Referência fantasma: a referência virtual é a referência mais fraca em Java, então quão fraco é? É tão frágil que não podemos nem obter o objeto referenciado por meio de referências virtuais. O único objetivo das referências virtuais é que, quando o objeto aponta é reciclado, a própria referência virtual será adicionada à fila de referência e usada para registrar que o objeto que aponta foi reciclado.
2. Por que por quando usam referências fracas?
Considere o seguinte cenário: agora existe uma classe Product que representa um produto, projetado para não ser escalável e, neste momento, queremos adicionar um número a cada produto. Uma solução é usar HashMap<Product, Integer> . Então o problema vem. Se não precisarmos mais de um objeto Product para existir na memória (por exemplo, este produto foi vendido), assumindo que a referência a ele seja productA , atribuiremos um valor ao productA como null . No entanto, neste momento, o objeto Product apontado pela productA no passado não será reciclado, porque é obviamente referenciado pelo HashMap . Portanto, nesse caso, se queremos reciclar verdadeiramente um objeto Product , ele não é suficiente para atribuir sua forte referência a null e também precisamos remover a entrada correspondente HashMap . Obviamente, não queremos concluir o trabalho de "remover não mais entradas necessárias do HashMap ". Queremos dizer ao coletor de lixo: somente key no HashMap faz referência Product , o objeto Product correspondente pode ser reciclado. Obviamente, com base na definição anterior de citações fracas, o uso de citações fracas pode nos ajudar a atingir esse objetivo. Só precisamos usar um objeto de referência fraco apontando para Product como key no HashMap .
3. Como-como usar referências fracas?
Tome o cenário introduzido acima como exemplo. Usamos um objeto de referência fraco apontando para Product como key do HashMap e apenas definimos esse objeto de referência fraco como este:
Produto ProductA = novo produto (...); fraco Reference <Product> fracosProducta = new frAchereference <> (ProductA);
Agora, se o objeto weakProductA for referenciado, ele aponta para Product productA . Então, como obtemos Product Object productA que ele aponta através weakProduct ?
É muito simples, só preciso do seguinte código:
Produto Produto = fracosProducta.get ();
De fato, para este caso, a biblioteca da classe Java nos fornece a classe de WeakHashMap . Usando esta classe, sua chave é naturalmente um objeto de referência fraco e não precisamos mais embrulhar manualmente o objeto original. Dessa maneira, quando productA se torna null (indica que Product que ele faz referência não precisa mais existir na memória), Product objeto de referência fraco é weakProductA , então, obviamente, o objeto Product correspondente é fraco e pode ser alcançado nesse momento, de modo que a referência fraca apontando para ele será liberada, e o objeto Product será reciclado e a fraca referência que apontará a ele será liberada para que o referência seja que o objeto de referência e a referência.
4. Fila de referência
Vamos apresentar brevemente o conceito de citar filas. De fato, a aula de WeakReference tem dois construtores:
// Crie uma referência fraca à referência fraca do objeto dado (referência t) // Crie uma referência fraca ao objeto dado e registra uma referência fraca à fila de referência dada Referência de fraco (referência t, referência para cenário <? Super t> q)
Podemos ver que o segundo construtor fornece um parâmetro do tipo ReferenceQueue . Ao fornecer este parâmetro, registramos o objeto de referência fraco criado em uma fila de referência. Dessa forma, quando for liberado pelo coletor de lixo, será enviado para a fila de referência e podemos gerenciar esses objetos de referência fracos limpos de uma maneira unificada.
5. Resumo
Bem, o conteúdo deste artigo termina aqui. Devido ao nível pessoal limitado, existem aspectos inevitavelmente imprecisos ou pouco claros na narrativa. Espero que você possa apontar, obrigado pelo seu apoio ao wulin.com.