Resumo da entrevista 20230909java

1.java coleções comumente usadas

ArrayList array dinâmico, ajustar tamanho dinamicamente, implementar interface de lista
LinkedList lista duplamente vinculada, implementar lista e interface de fila, adequado para operações frequentes de inserção e exclusão
Desordem HashSet, usar tabela hash para realizar
a ordem TreeSet, usar árvore vermelho-preta para realizar
desordem HashMap, Use a tabela hash
TreeMap para ordenar, use a árvore vermelha e preta
LinkedHashMap para ordenar, use a tabela hash e a lista duplamente vinculada, mantenha o pedido de inserção
Fila de fila
PriorityQueue fila de prioridade, classifique a pilha de pilha de acordo com a prioridade
, último a entrar, primeiro a sair

2. As diferenças e cenários de uso entre árvores rubro-negras e árvores b+

Cenários de aplicação: TreeSet e TreeMap em coleções java, listas vinculadas HashMap maiores que 8 são convertidas em árvores vermelho-pretas; definir e mapear em stl de cpp; gerenciamento de memória virtual Linux Vantagens de árvores vermelho-pretas em comparação com árvores b+: rbt é
usado para classificação interna e b+t é uma estrutura de dados amigável ao disco usada na memória externa; a árvore vermelha e preta tem complexidade de tempo mais rápida para inserção, exclusão e pesquisa.

3. Comparação entre ArrayList e LinkedList

1. ArrayList é um array dinâmico e LinkedList é uma lista vinculada.
2. O acesso aleatório ao array é rápido e a vinculação é rápida para adicionar e excluir.
3. arraylist precisa ser definido manualmente para um tamanho fixo e o grau de link de liberdade muda dinamicamente
4. arraylist é expandido para 1,5 vezes.

4. Precauções ao usar ArrayList

1. Problema de thread inseguro 1: dois threads adicionam elementos ao mesmo tempo e garantir que a capacidade é avaliada com sucesso, fazendo com que a matriz saia dos limites. 2. Problema de thread
inseguro 2: o valor do elemento é substituído para ficar vazio. Multi-threads escreva ao mesmo tempo.
Processamento seguro: sincronizadoList, dê add Lock, copyonwirteArrayList (copiar na gravação), use ThreadLocal para garantir o fechamento do thread

5. Parâmetros principais do pool de threads Java

corePoolSize: o número de threads principais, o tamanho básico do pool de threads quando não há tarefa
MaximumPoolSize: o número máximo de threads no pool de threads
keepAliveTime: quando maior que o núcleo, o maior tempo de sobrevivência do excesso de threads ociosos durante o período de espera
unidade: unidade de tempo keepAliveTime
workQueue: armazena tarefas a serem executadas Fila de bloqueio
threadFactory: manipulador de classe de fábrica para criar novos threads
: quando o pool de threads atinge o número máximo de threads e a fila de tarefas está cheia, estratégias comuns incluem lançar um thread, descartar o tarefa, descartando a tarefa mais antiga e executando diretamente no thread do chamador

6. Como funciona o pool de threads

Insira a descrição da imagem aqui

1. Menor que o núcleo, crie e execute diretamente no pool de threads principais
2. Maior ou igual ao núcleo, entre na fila e espere
3. A fila está cheia, crie um thread não principal e execute-o imediatamente
4. A fila está cheia , maior ou igual ao máximo, processamento do manipulador
5. A execução da tarefa é concluída Remova e remova um thread ao mesmo tempo.
6. Se o tempo ocioso exceder o tempo de atividade e for maior que o núcleo, os threads extras irão parar de reciclar.

7. Por que usar fila de bloqueio?

1. Coordenar e controlar a execução do thread para evitar perda ou backlog de tarefas
2. Buffer de tarefas para garantir que não seja executado imediatamente, equilibrando efetivamente a velocidade de produção e consumo das tarefas
3. Gerenciamento de threads, quando o thread do pool de threads está ocupado, novas tarefas estão esperando na fila

Se uma fila sem bloqueio for usada,
1. O número de threads é descontrolado e os recursos estão esgotados.
2. As tarefas são perdidas. Se a fila estiver cheia, novas tarefas são imediatamente descartadas
. 3. As condições de corrida podem causar problemas de consistência de dados.

8.rehash do hashMap

O hashCode de cada chave é o tamanho da matriz do bucket len. Rehash significa que len se torna maior, mas ainda é uniforme.

9. Como projetar o pool de threads quando a CPU é intensiva

Use o número de núcleos de CPU + 1 thread. +1 garante que quando uma interrupção de falha de página ocorre e é bloqueada, threads adicionais podem ser adicionados.
Idealmente, todos os núcleos da CPU estão executando threads no pool de threads.

10. Como projetar um pool de threads para uso intensivo de io

Número ideal de threads = 1 + io demorado / demorado da CPU, melhorando assim a utilização da CPU e io

11.Princípio Threadlocal e cenários de uso

Refere-se às variáveis ​​locais do thread, tornando cada cópia de variável independente para cada thread, alcançando o isolamento da variável.
Cada thread possui uma variável de membro threadlocalmap, que pode ser usada para armazenar dados.
Cenários de uso:
1. Armazene informações do usuário globalmente.
2. Variáveis ​​para isolamento de thread são encapsuladas usando threadlocal
. 3. Quando vários métodos usam o mesmo objeto, use threadlocal. de parâmetros. transfer para reduzir o acoplamento de código; por exemplo, threadlocal é usado em @transaction para salvar a conexão.

12.Notas sobre o uso de threadlocal

Problema de vazamento de memória: significa que a memória heap alocada dinamicamente no programa não é liberada ou não pode ser liberada por algum motivo, causando desperdício de memória, travando o sistema e, finalmente, acumulando-se, causando estouro de memória.

Como o objeto de entrada é modificado por uma referência fraca, ele será limpo na próxima coleta de lixo para realizar a desvinculação do threadlocal e do ciclo de vida do thread.Neste momento, a chave de entrada é nula,
mas há uma referência forte de referência do thread atual no threadlocalmap, portanto o valor não pode ser claro.

Portanto, precisamos remover manualmente o objeto de entrada.

A razão para usar referências fracas é porque a chave será julgada durante os processos set e getEntry. Se a chave for nula, o valor também será definido como nulo. Dessa forma, mesmo se você esquecer de chamar remove, quando threadlocal for destruído, o valor será apagado.

Um dos destaques do design em ThreadLocal é que a estrutura Key of the Entry em ThreadLocalMap usa referências fracas. Imagine se você usar referências fortes, isso significa que todos os dados em ThreadLocalMap estão vinculados ao ciclo de vida do Thread, então é fácil causar vazamentos de memória devido à atividade contínua de um grande número de threads. Se referências fracas forem usadas, depois que a JVM acionar o GC para reciclar as referências fracas, ThreadLocal poderá excluir os valores cuja chave é nula no ThreadLocalMap na próxima vez que chamar get(), set() e remove() métodos, que desempenham o papel de exclusão lenta para liberar memória.

Em segundo lugar, haverá uma travessia correspondente no ThreadLocalMap para verificar o slot com uma chave nula e excluí-lo ~

Acho que você gosta

Origin blog.csdn.net/weixin_40986490/article/details/132781726
Recomendado
Clasificación