Programação simultânea (perguntas da entrevista em Java)

1. O que é um processo? O que é um tópico?

Processo é a menor unidade de alocação de recursos, o segmento é a menor unidade de agendamento da CPU, um processo contém vários segmentos

2, fale sobre o ciclo de vida do fio

O segmento tem cinco estados: criar, aguardar, executar, bloquear, finalizar, existem três maneiras de criar um segmento, duas não têm valor de retorno, uma tem valor de retorno, a primeira é herdar a classe Thread e a segunda é implementar a interface Runnable, O terceiro é criado por Callable e Future (substitua o método Call da classe Callable, obtenha o valor de retorno Call através do método get); depois que o thread é criado, o thread é colocado em um estado de espera chamando o método start, quando o thread é agendado pela CPU. Digite o estado de execução. Se o encadeamento chamar o método de suspensão ou o método de espera para entrar no estado de bloqueio. Em seguida, use o método interrupt interrupt para lançar uma exceção para ativar o encadeamento adormecido ou notifique e notifyAll para ativar o encadeamento em espera e insira o conjunto de bloqueios de objetos. Existem três situações em que o encadeamento terminará: o primeiro é o fim do método de execução, o segundo é chamar o método stop para forçar o final e o terceiro é usar o método de interrupção interrupção para finalizar o encadeamento em um local adequado.

3. Quais são as cinco diferenças entre wait () e sleep ()?

Existem cinco diferenças: a primeira é que o sono não abrirá mão dos recursos da CPU, a espera será, a segunda é que o sono não liberará o bloqueio, a espera será, a terceira é que o sono poderá ser chamado em qualquer local, o método de espera só poderá ser sincronizado Chamado em um método de bloco ou síncrono, o quarto é entrar no estado de espera após o despertar do sono e competir por bloqueios no conjunto de bloqueios do objeto após o despertar. A quinta diferença é que o método sleep é um método thread e wait é um método Object.

4. Qual é a diferença entre wait (), notify (), notifyAll ()?

linha para esperar método libera o bloqueio e deixar que os recursos da CPU, notificar acordar aleatória bloqueio objeto um pool de threads, notifyAll acordar o bloqueio objeto da piscina
e alguns fios, maior a probabilidade de uma maior disputa thread de prioridade de bloqueio ( setPriority () 1 tem a prioridade mais baixa, 10 tem a prioridade mais alta, o valor padrão é 5
, thread.setPriority (1))

5. Qual é o papel do Volátil?

Assegurar a visibilidade entre threads, para evitar instrução rearranjo, cada leitura modificado variável quando lidos diretamente da memória principal (região fio compartilhado), em vez de
ler a partir da memória de trabalho (rosca região privada, pilha) de Busque, para que o encadeamento possa garantir que o valor mais recente seja lido sempre. No entanto, o Volatile pode garantir apenas a
visibilidade entre os threads, mas não a atomicidade.Se dois threads copiam variáveis ​​na memória de trabalho ao mesmo tempo e as copiam para a memória principal após a modificação
, haverá um problema. Como dito anteriormente, a leitura na memória de trabalho é na verdade a área de cache de trabalho que é copiada. A área de cache de trabalho é um conceito abstrato.
Não há divisão dessa área na jvm. O posicionamento específico é determinado pela máquina virtual. Desde que esteja em conformidade com a especificação JMM.

6. Cenários de aplicação do Volatile?

Não há necessidade de garantir a segurança do encadeamento.Por exemplo, o método run possui uma variável modificada pelo Volatile como um switch.Quando o switch é falso, ele sai do loop.

7. Quais são as três diferenças entre Volátil e Sincronizado?

A primeira é que volátil é a sincronização leve (não exclusiva, a atomicidade não é garantida), sincronizada é a sincronização pesada (exclusiva, a comutação da CPU consome recursos) A segunda é a diferença é que a volátil não garante a atomicidade, enquanto a sincronização garante a atomicidade Para garantir a visibilidade, o terceiro é que o volátil pode modificar apenas variáveis, o sincronizado pode modificar os blocos e métodos de código

8. Quando ocorrerá um impasse? Como evitar o impasse?

Existem quatro condições para impasse: exclusão mútua, não preempção, solicitação e retenção e espera de loop. Há duas maneiras de evitar bloqueios: o primeiro é que a ordem do bloqueio deve ser consistente e o segundo é definir um tempo limite para o bloqueio.

9. Como definir um tempo limite para o bloqueio?

10. Como usar o código para solucionar problemas de produtores e consumidores?

Crie uma classe de recurso, defina o número máximo de recursos como 10, o número atual de recursos é 0, existem métodos de remoção e colocação na classe, remova o método para determinar se o número atual de recursos é 0, chame o método de espera para esperar Recurso diferente de zero - finalmente, use o notify para ativar outros threads (por que não o notall para ativar tudo? Como a ativação também é aleatória, todas as ativações também são contenções aleatórias para bloqueios; é claro, quanto menor o número, menos recursos são consumidos), o método put também é Da mesma maneira, para determinar se o recurso atingiu o valor máximo, aguarde se ele o atinge e, se o recurso ++ estiver em falta, finalmente ative outros threads. As classes consumidor e produtor usam uma combinação para chamar os métodos remove e colocar da classe de recurso para criar e iniciar encadeamentos do produtor consumidor, respectivamente

11. O princípio de realização de Sincronizado?

Antes do jdk1.6, sincronizado é um peso pesado, mas após a otimização contínua, ele se torna muito poderoso após o jdk1.6 O bloqueio sincronizado possui quatro estados: nenhum bloqueio, bloqueio de polarização, bloqueio leve e bloqueio de peso pesado. Como o estado da competição é gradualmente atualizado, ele não pode ser rebaixado.Quando o bloqueio é adquirido pela primeira vez, as informações de bloqueio no cabeçalho do objeto Mark word serão modificadas através do CAS.O bloqueio será atualizado do CAS para um bloqueio tendencioso. Sem a concorrência de outros encadeamentos, não há necessidade de bloquear e desbloquear através do CAS, e o encadeamento polarizado sempre terá o bloqueio polarizado. Quando um encadeamento deseja competir por uma trava polarizada, ocorrerá o cancelamento da trava. Se a linha que segura a trava polarizada saiu do bloco de código sincronizado ou não estiver ativa, o encadeamento que trava a trava polarizada será tentativamente colocado em um local seguro e liberado. Bloquear e, em seguida, ative o segmento que mantém o bloqueio polarizado (interromper?). Os segmentos concorrentes modificam o ID do segmento polarizado na palavra Marcar através do CAS para obter o bloqueio polarizado. Se ocorrer concorrência e o encadeamento que segura a trava polarizada não sair do bloco de código sincronizado, a trava polarizada será atualizada para uma trava leve, e a JVM abrirá um espaço para armazenar informações de trava na pilha da thread polarizada e armazenará a cópia do MarkWord no cabeçalho do objeto. O MarkWord no cabeçalho do objeto é substituído por um ponteiro para as informações de bloqueio na pilha. Quando a trava leve é ​​liberada
, o MarkWord é substituído novamente na cabeça do objeto e, em seguida, o thread que originalmente continha a trava polarizada é despertado. O segmento concorrente tenta substituir o MarkWord por um ponteiro para as informações na pilha. Se a substituição for bem-sucedida, é obtida uma trava leve. Se a substituição falhar, a rotação falhará e o número de rotações será atualizado para uma trava pesada. A trava pesada do monitor é baseada no monitorenter A instrução monitorexit é implementada, o monitorenter é inserido na posição inicial e o monitorexit é inserido na posição final. A JVM precisa garantir que cada monitorenter tenha um monitorexit associado e cada objeto tenha um monitor associado. Quando um monitor é mantido, O objeto será bloqueado. Quando o encadeamento executa a instrução do monitorenter, ele tenta adquirir a propriedade do monitor correspondente ao bloqueio do objeto, ou seja, tenta adquirir o bloqueio do objeto.

12. Qual é a diferença entre esse bloqueio, bloqueio de objeto e bloqueio de classe?

Esse bloqueio bloqueia a instância atual, o bloqueio de objeto bloqueia o objeto especificado, o bloqueio de classe bloqueia o objeto de classe. Sincronizado é esse bloqueio ao modificar o método comum, User.class.wait () libera o bloqueio e o método estático É um bloqueio de classe, você pode especificar o tipo de bloqueio ao decorar o bloco de código, a essência é usar o monitor

13. Quais são os tipos comuns de bloqueios?

Bloqueio CAS: Três operandos básicos são usados ​​no mecanismo AS: endereço de memória V, valor esperado antigo A e novo valor B a ser modificado. Ao atualizar uma variável, o valor correspondente ao endereço de memória V será alterado para B somente quando o valor esperado A da variável e o valor real no endereço de memória V forem iguais. Bloqueio de rotação: é através do CAS determinar continuamente se a condição de bloqueio é atendida. Bloqueio otimista: Acredita-se que, desde o início, a execução seja bem-sucedida e seja controlada pelo número da versão ou carimbo de data / hora.O CAS é um bloqueio otimista. Bloqueios pessimistas: No início, acreditava-se que não seria executado com êxito, e a disputa por bloqueios foi seguida pela execução da lógica de negócios. Bloqueio de reentrada: depois que a camada externa adquire a trava, a camada interna não precisa adquiri-la novamente para evitar conflitos.ReentrantLock e sincronizados são bloqueios de reentrada. Bloqueios não reentrantes: Depois que a camada externa adquire o bloqueio, a camada interna também deve readquirir o bloqueio, que é propenso a impasse. Bloqueios justos: aqueles que entram no pool de bloqueios de objetos em períodos diferentes adquirem bloqueios de acordo com as regras dos bloqueios de primeiro a chegar, primeiro a ser servido. Bloqueios injustos: aqueles que entram no pool de bloqueios de objetos em períodos diferentes adquirem bloqueios de acordo com as regras de competição por bloqueios: bloqueios de
polarização, bloqueios leves e bloqueios pesados. Bloqueio de segmento: fale sobre o ConcrrountHashMap. Bloqueios distribuídos: Redis, ZK, etc. Bloqueio de leitura e gravação: não permita outras leituras e gravações ao gravar, e o serviço não permite um motivo ao sincronizar com o zk.

14. Fale sobre as três diferenças entre o ReetranLock e o Synchronized?

ReentrantLock delega todas as operações da interface Lock para a classe Sync.A classe Sync herda a classe abstrata AQS.A Sync possui duas subclasses, uma que suporta bloqueios justos e
outra que suporta bloqueios injustos. O bloqueio injusto é usado por padrão. ReentrantLock.lock chama o método NonFairSync.lock (o AQS apenas entrega o
método de tentar adquirir o bloqueio a uma subclasse para implementar o bloqueio de bloqueio holdLock () para determinar se o bloqueio foi adquirido). Geralmente, unlock () é gravado no bloco final para evitar conflitos

15. Quatro diferenças entre o ReetranLock e o Synchronized?

A primeira diferença: uma é uma classe, uma é uma palavra-chave, a segunda diferença: pode-se determinar se a trava é adquirida, uma não é, a terceira diferença: uma é a transmissão automática (especificando a posição inicial e a posição final), É um bloco manual (método de decoração e bloco de código)
.A quarta diferença: lock é um bloqueio otimista. Sincronizado originalmente usou um bloqueio pessimista.Depois do jdk1.6, ele se torna muito poderoso e pode ser atualizado.

16. O papel de join ()

Threads de bloqueio, geralmente usados ​​para garantir a ordem de execução dos threads

17. Qual é a diferença entre run () e start ()?

run () é apenas um método simples e não cria um encadeamento, e o método start é executar o método run após criar o encadeamento

18. Qual é a diferença entre CycliBarriar e CountdownLatch?

A primeira diferença é que o foco é diferente.O CycliBarriar geralmente é usado para bloquear um grupo de threads até que um determinado estado seja executado. CountdownLatch é deixar um thread aguardar que outros threads
concluam a tarefa antes de executar. A segunda diferença é que o CycliBarriar pode ser reciclado CountdownLatch é único, bloqueará o encadeamento antes de 0

19. Problemas comuns no ambiente multithread?

Condição de corrida: opere simultaneamente dados não seguros para thread, resultando em resultados inesperados
Impasse: pegue recursos um do outro
Livelock: deixe recursos um para o outro, resolva,
fome , primeiro a chegar, primeiro a ser servido : recursos insuficientes

20. O que é um átomo?

Por exemplo, a classe AtomicInteger pode chamar métodos para aumentar ou diminuir para garantir a segurança do encadeamento

21. O que é um bloqueio CAS?

O CAS possui 3 operandos, valor de memória V, valor esperado antigo A e novo valor B a ser modificado. Se e somente se o valor esperado A e o valor da memória V forem iguais, modifique o valor da memória V para B, caso contrário, retorne V.
Este é um bloqueio otimista de pensar, acredito que antes de mudar, há outros tópicos para modificá-lo; e sincronizado é um bloqueio pessimista, ele pensa antes de mudar, uma
haverá outros tópicos para modificá-lo, bloqueio pessimista A eficiência é muito baixa.
Existe um problema muito óbvio com o CAS, ou seja, o problema ABA;
se a variável V é A quando é lida pela primeira vez e é verificado que ela ainda é A durante a preparação da atribuição, isso pode indicar que seu valor não foi modificado por outros threads. É isso?
Se tiver sido alterado para B durante esse período e depois alterado para A, a operação do CAS executará mal a tarefa e nunca foi modificada. Em resposta a essa situação, o pacote simultâneo java fornece
uma classe de aplicativo atômica marcada AtomicStampedRefernce, que pode garantir a correção do CAS através da versão do valor da variável;

22. Quais são os bloqueios comuns na camada de aplicação?

bloqueio sincronizado

23. Cenários de aplicação de bloqueio pessimista?

Quando a quantidade de simultaneidade é alta, o bloqueio otimista é usado se a resposta for rápida, ou será bem-sucedida ou falhará rapidamente.Se o custo de nova tentativa for alto, use o bloqueio pessimista, que
pode garantir a taxa de sucesso.
O bloqueio pessimista é adequado para ler menos e escrever mais, o bloqueio otimista é adequado para ler mais e escrever menos

24. O que acontece com o impasse de IO?

25. Como determinar rapidamente se é um problema de conflito de E / S e não outros problemas?

26. A CLH sabe? Fila virtual.

A fila virtual não é uma fila real, mas o ponteiro aponta para o próximo nó, que se parece com uma fila

27. Por que os bloqueios de verificação dupla precisam ser voláteis?

28. Por que o multi-threading pode melhorar a eficiência?

29. Se eu abrir novos threads indefinidamente, a eficiência deste programa continuará aumentando ou diminuirá ou permanecerá inalterada?

30. Sincronizado é um servidor único para lidar com problemas de simultaneidade, e vários servidores?

31. Por que wait (), notify (), notifyall () devem ser chamados no bloco de código sincronizado

32. Otimização de sincronizado pela máquina virtual java

Sincronizado é um bloqueio pesado antes de 1.6, e bloqueio tendencioso, bloqueio leve e bloqueio de rotação adaptável foram introduzidos após 1.6

33. Como compartilhar dados entre dois threads

Criar uma variável estática global
Pass reference pelo método

34. Como usar a espera corretamente? se ou enquanto?

Você deve usar enquanto, caso contrário, aguarde pela primeira vez, depois de acordar, vá diretamente para o processo a seguir, você
precisa julgar se as condições são atendidas antes de cair.

35. Por que usar multithreading? Cenários de aplicativos multithread?

O multiencadeamento pode melhorar a utilização da CPU. Por exemplo, ao enviar uma mensagem de texto durante o registro, você pode enviar uma
mensagem de texto durante o processamento da lógica de negócios.Há também vários uploads de arquivos e aop para gravar logs de forma assíncrona.

36. Como detectar deadlock?

O jstack pode indicar qual local está em um impasse, o jvm vem com ferramentas

37. Como garantir que apenas um método run () seja executado no multithreading? (*******)

38. O que é uma fila de bloqueio? Como conseguir isso?

Questões de produtores e consumidores

39. O que é o ThreadLocal? Qual é o papel? (*******)

40. A diferença entre síncrona e assíncrona

Síncrona: Todas as operações são concluídas antes de serem devolvidas ao usuário, por exemplo: transferência bancária
Assíncrona: Não é necessário aguardar a conclusão de todas as operações e, em seguida, retorne os resultados para obter atualização parcial.

Publicado 51 artigos originais · Curtidas2 · Visitas 1850

Acho que você gosta

Origin blog.csdn.net/qq_42972645/article/details/105658158
Recomendado
Clasificación