As últimas perguntas da entrevista simultânea do Java em 2020, quais você ainda não conhece? (Incluindo resposta + mapa mental)

Programação simultânea Java

 

1. Três elementos de programação simultânea?

2. Quais são as maneiras de obter visibilidade?

3. O valor do multithreading?

4. Quais são as maneiras de criar tópicos?

5. Comparação das três maneiras de criar threads?

6. O diagrama de fluxo de estado do segmento

7. Threads Java têm cinco estados básicos

8. O que é um pool de threads? Quais são as maneiras de criá-lo?

9. A criação de quatro pools de threads:

10. Quais são as vantagens dos pools de threads?

11. Quais são as ferramentas de simultaneidade comumente usadas?

12. A diferença entre CyclicBarrier e CountDownLatch

13. Qual é a função de sincronizado?

14. O papel da palavra-chave volátil

15. O que é CAS

16. O problema do CAS

17. O que é futuro?

18. O que é AQS

19. AQS suporta dois métodos de sincronização:

20. O que é ReadWriteLock

21. O que é FutureTask

22, a diferença entre synchronized e ReentrantLock

23. O que é bloqueio otimista e bloqueio pessimista

24. Como o thread B sabe que o thread A modificou a variável?

25, sincronizado, volátil, comparação CAS

26. Qual é a diferença entre o método de sono e o método de espera?

27. O que é ThreadLocal? Qual é a utilidade?

28. Por que o método wait () e o método notificar () / notificarAll () devem ser chamados no bloco sincronizado

29. Quais são os métodos de sincronização multi-thread?

30, estratégia de programação de discussão

31. Qual é a simultaneidade de ConcurrentHashMap

32. Como descobrir qual thread usa a CPU mais longa no ambiente Linux

33. Impasse Java e como evitá-lo?

34, a causa do impasse

35. Como despertar um tópico bloqueado

36. Como os objetos imutáveis ​​ajudam no multithreading?

37. O que é a troca de contexto multi-threaded

38. O que acontece se a fila do pool de threads estiver cheia quando você enviar uma tarefa

39. Qual é o algoritmo de escalonamento de thread usado em Java

40. O que é agendador de thread (Thread Scheduler) e divisão de tempo (TimeSlicing)?

41, o que é spin

42. O que é a interface Lock na API Java Concurrency? Quais são suas vantagens sobre a sincronização?

43. Segurança de thread do modo singleton

44. Qual é o papel do Semaphore

45. O que é a classe Executors?

46. ​​Qual thread o construtor da classe de thread e o bloco estático são chamados?

47. Qual é a melhor escolha, método de sincronização ou bloco de sincronização?

48. Quais exceções podem ser causadas por muitos encadeamentos Java?

 

Pontos de conhecimento de programação simultânea compilaram um mapa mental

 

1. Três elementos de programação simultânea?

(1) Atomicidade

A atomicidade se refere a uma ou mais operações, ou todas são executadas e não interrompidas por outras operações durante a execução, ou todas não são executadas.

(2) Visibilidade

Visibilidade significa que quando vários threads manipulam uma variável compartilhada, depois que um thread modifica a variável, outros threads podem ver imediatamente o resultado da modificação.

(3) Ordem

Ordem, ou seja, a ordem de execução do programa é executada na ordem do código.

 

2. Quais são as maneiras de obter visibilidade?

Sincronizado ou Bloquear: Certifique-se de que apenas um thread adquira o bloqueio para executar o código ao mesmo tempo e libera o valor mais recente para a memória principal antes que o bloqueio seja liberado para obter visibilidade.

3. O valor do multithreading?

(1) Aproveite as vantagens da CPU multi-core

O multi-threading pode realmente aproveitar as vantagens das CPUs multi-core e atingir o objetivo de fazer uso total da CPU, usando o multi-threading para realizar várias coisas ao mesmo tempo sem interferir umas nas outras.

(2) Impedir o bloqueio

Do ponto de vista da eficiência do programa, uma CPU de núcleo único não só não oferece as vantagens do multi-threading, mas também muda o contexto do thread devido ao multi-threading rodando em uma CPU de núcleo único, o que reduz a eficiência geral do programa. Mas para CPU de núcleo único, ainda temos que aplicar multi-threading, apenas para evitar o bloqueio. Imagine que, se uma CPU de núcleo único usa um único thread, então, enquanto o thread estiver bloqueado, por exemplo, lendo certos dados remotamente, o par não retornou e o período de tempo limite não foi definido, então todo o seu programa estará antes de os dados serem retornados. Parou de correr. O multithreading pode evitar esse problema. Múltiplos threads são executados ao mesmo tempo, mesmo que a execução de um código de thread seja bloqueada para leitura de dados, isso não afetará a execução de outras tarefas.

(3) Fácil de modelar

Essa é outra vantagem que não é tão óbvia. Suponha que haja uma grande tarefa A, programação de thread único, então existem muitas considerações e é problemático construir todo o modelo do programa. Mas se você dividir essa grande tarefa A em várias pequenas tarefas, tarefa B, tarefa C e tarefa D, construir modelos de programa separadamente e executar essas tarefas separadamente por meio de multithreading, é muito mais simples.

 

4. Quais são as maneiras de criar tópicos?

(1) Herdar a classe Thread para criar uma classe de thread

(2) Criar classe de thread por meio da interface Runnable

(3) Criar discussão por meio de Callable e Future

(4) Criado por thread pool

 

5. Comparação das três maneiras de criar threads?

(1) Crie vários threads implementando interfaces Runnable e Callable.

As vantagens são:

A classe thread apenas implementa a interface Runnable ou a interface Callable e também pode herdar de outras classes. Desta forma, várias threads podem compartilhar o mesmo objeto de destino, por isso é muito adequado para várias threads mesmas processar o mesmo recurso, de modo que a CPU, o código e os dados podem ser separados para formar um modelo claro e refletir melhor A ideia de orientação a objetos.

As desvantagens são:

A programação é um pouco mais complicada.Se você quiser acessar o thread atual, você deve usar o método Thread.currentThread ().

(2) Criar multithreading herdando a classe Thread

As vantagens são:

É fácil de escrever.Se você precisa acessar o thread atual, você não precisa usar o método Thread.currentThread (). Você pode usar isso diretamente para obter o thread atual.

As desvantagens são:

A classe thread herdou a classe Thread, portanto não pode mais herdar de outras classes pai.

(3) A diferença entre Executável e Chamável

1. O método Callable especifica (override) é call (), o método Runnable especifica (override) é run ().

2. Tarefas chamáveis ​​podem retornar valores após a execução, enquanto tarefas executáveis ​​não podem retornar valores.

3. O método Call pode lançar exceções, mas o método run não.

4. Execute a tarefa Callable para obter um objeto Future, que representa o resultado do cálculo assíncrono. Ele fornece uma maneira de verificar se o cálculo foi concluído, aguardar a conclusão do cálculo e recuperar o resultado do cálculo. Por meio do objeto Future, você pode entender a execução da tarefa, cancelar a execução da tarefa e obter o resultado da execução.

 

6. O diagrama de fluxo de estado do segmento

O ciclo de vida de um thread e cinco estados básicos:

Perguntas selecionadas da entrevista de simultaneidade do Java em 2019, quais você ainda não conhece?  (Incluindo resposta e mapa mental)

 

7. Threads Java têm cinco estados básicos

(1) Novo estado (Novo) : Quando o par de objetos thread é criado, ele entra no novo estado, como: Thread t = new MyThread ();

(2) Estado pronto (Runnable) : Quando o método start () (t.start ();) do objeto thread é chamado, o thread entra no estado pronto. O thread no estado pronto significa apenas que o thread está pronto e aguardando que a CPU agende a execução a qualquer momento, não que o thread será executado imediatamente após a execução de t.start ();

(3) Estado de execução : Quando a CPU começa a agendar um thread no estado pronto, o thread pode ser executado de fato, ou seja, entra no estado de execução. Nota: O estado pronto é a única entrada para o estado de execução, ou seja, se um encadeamento deseja entrar no estado de execução para execução, primeiro deve estar no estado pronto;

(4) Bloqueado : por algum motivo, o thread no estado de execução desiste temporariamente do direito de usar a CPU e interrompe a execução. Nesse momento, ele entra no estado bloqueado. Até que entre no estado pronto, ele tem a chance de ser novamente pela CPU. Ligue para entrar no estado de funcionamento.

De acordo com as diferentes causas de bloqueio, o estado de bloqueio pode ser dividido em três tipos:

1) Aguardando bloqueio: a thread no estado de execução executa o método wait () para fazer a thread entrar no estado de bloqueio em espera;

2) Bloqueio síncrono: o thread não consegue adquirir o bloqueio de sincronização sincronizado (porque o bloqueio está ocupado por outros threads),

Ele entrará no estado de bloqueio síncrono;

3) Outro bloqueio: A thread entrará no estado de bloqueio chamando sleep () ou join () da thread ou emitindo uma solicitação de E / S. Quando o estado sleep () atinge o tempo limite, join () espera o encadeamento terminar ou atingir o tempo limite, ou o processamento de E / S é concluído, o encadeamento volta ao estado pronto novamente.

(5) Dead state (Dead) : O thread termina sua execução ou sai do método run () devido a uma exceção, e o thread termina seu ciclo de vida.

 

8. O que é um pool de threads? Quais são as maneiras de criá-lo?

O pool de threads deve criar vários threads com antecedência. Se houver tarefas a serem processadas, os threads no pool de threads processarão as tarefas. Após o processamento, os threads não serão destruídos, mas aguardarão a próxima tarefa. Visto que a criação e destruição de threads consomem recursos do sistema, você pode considerar o uso de pools de threads para melhorar o desempenho do sistema quando quiser criar e destruir threads com frequência.

Java fornece uma implementação da interface java.util.concurrent.Executor para criar pools de encadeamentos.

 

9. A criação de quatro pools de threads:

(1) newCachedThreadPool cria um pool de thread armazenável

(2) newFixedThreadPool cria um pool de threads de comprimento fixo, que pode controlar o número máximo de threads simultâneos.

(3) newScheduledThreadPool cria um pool de threads de comprimento fixo para suportar temporização e execução periódica de tarefas.

(4) newSingleThreadExecutor cria um pool de thread único, que usará apenas um thread de trabalho para realizar tarefas.

 

10. Quais são as vantagens dos pools de threads?

(1) Reutilizar threads existentes para reduzir a sobrecarga de criação e destruição de objetos.

(2) Pode controlar efetivamente o número máximo de threads simultâneos, melhorar a taxa de utilização dos recursos do sistema e evitar a competição e o bloqueio excessivos de recursos.

(3) Fornece funções como execução de tempo, execução regular, thread único e controle de número simultâneo.

 

11. Quais são as ferramentas de simultaneidade comumente usadas?

(1) CountDownLatch

(2) CyclicBarrier

(3) Semáforo

(4) Trocador

 

12. A diferença entre CyclicBarrier e CountDownLatch

(1) CountDownLatch significa simplesmente que uma thread espera até que as outras threads que está esperando tenham completado a execução e chame o método countDown () para notificar a thread atual antes de continuar a execução.

(2) cyclicBarrier é que todas as threads esperam até que todas as threads estejam prontas para entrar no método await (), todas as threads começam a ser executadas ao mesmo tempo!

(3) O contador de CountDownLatch só pode ser usado uma vez. O contador de CyclicBarrier pode ser zerado usando o método reset (). Portanto, CyclicBarrier pode lidar com cenários de negócios mais complexos, por exemplo, se ocorrer um erro no cálculo, o contador pode ser zerado e os threads podem ser executados novamente.

(4) CyclicBarrier também fornece outros métodos úteis, como o método getNumberWaiting para obter o número de threads bloqueados por CyclicBarrier. O método isBroken é usado para saber se o thread bloqueado foi interrompido. Retorna verdadeiro se interrompido, caso contrário retorna falso.

 

13. Qual é a função de sincronizado?

Em Java, a palavra-chave synchronized é usada para controlar a sincronização de encadeamentos, ou seja, em um ambiente multithread, para controlar o segmento de código sincronizado de ser executado por vários encadeamentos ao mesmo tempo. synchronized pode ser adicionado a um trecho de código ou método.

 

14. O papel da palavra-chave volátil

Para visibilidade, Java fornece a palavra-chave volatile para garantir visibilidade. Quando uma variável compartilhada é modificada por volatile, isso garantirá que o valor modificado seja atualizado para a memória principal imediatamente.Quando outras threads precisarem lê-la, ela irá para a memória para ler o novo valor. Do ponto de vista prático, um papel importante do volátil é combinar com o CAS para garantir a atomicidade. Para obter detalhes, consulte as classes do pacote java.util.concurrent.atomic, como AtomicInteger.

 

15. O que é CAS

CAS é a abreviatura de compare e swap, que é o que chamamos de compare exchange.

O cas é uma operação baseada em bloqueio e é um bloqueio otimista. Os bloqueios em java são divididos em bloqueios otimistas e bloqueios pessimistas. O bloqueio pessimista é bloquear o recurso e o próximo encadeamento só pode acessá-lo depois que um encadeamento que adquiriu o bloqueio anteriormente libera o bloqueio. O bloqueio otimista adota uma atitude ampla, processando recursos de alguma forma sem bloqueio, por exemplo, adicionando versão ao registro para obter dados, o desempenho é muito melhorado em comparação com o bloqueio pessimista.

A operação do CAS consiste em três operandos - localização da memória (V), valor original esperado (A) e novo valor (B). Se o valor no endereço de memória for igual ao valor de A, o valor na memória será atualizado para B. O CAS obtém dados por meio de um loop infinito. Se na primeira rodada do loop, o valor no endereço obtido pelo thread a for modificado pelo thread b, então o thread a precisa girar e pode não ter a chance de ser executado até o próximo loop.

A maioria das classes no pacote java.util.concurrent.atomic são implementadas usando operações CAS (AtomicInteger, AtomicBoolean, AtomicLong).

 

16. O problema do CAS

(1) CAS pode facilmente causar problemas de ABA

Um encadeamento a altera o valor para b e, em seguida, altera-o para a. Neste momento, o CAS pensa que não há alteração, mas mudou. A solução para esse problema pode ser identificada pelo número da versão e a versão é incrementada em 1 para cada operação. . Em java5, AtomicStampedReference foi fornecido para resolver o problema.

(2) A atomicidade do bloco de código não pode ser garantida

O mecanismo CAS garante a operação atômica de uma variável, mas não pode garantir a atomicidade de todo o bloco de código. Por exemplo, se você precisa garantir que 3 variáveis ​​sejam atualizadas atomicamente juntas, você deve usar synchronized.

(3) CAS causa um aumento na utilização da CPU

Como mencionado anteriormente, o CAS é um processo de julgamento cíclico, caso o thread não tenha obtido o status, os recursos da CPU estarão sempre ocupados.

 

17. O que é futuro?

Na programação concorrente, costumamos usar o modelo sem bloqueio Nas três implementações anteriores de multithreading, seja herdando a classe de thread ou implementando a interface executável, não há garantia de que os resultados da execução anterior serão obtidos. Implementando a interface de retorno de chamada e usando Future, você pode receber resultados de execução multithread.

Futuro representa o resultado de uma tarefa assíncrona que pode não ser concluída. Para esse resultado, um retorno de chamada pode ser adicionado para realizar a operação correspondente após a execução da tarefa ser bem-sucedida ou falhar.

18. O que é AQS

AQS é a abreviatura de AbustactQueuedSynchronizer. É uma classe de ferramenta de sincronização de baixo nível aprimorada por Java. Ela usa uma variável do tipo int para representar o estado de sincronização e fornece uma série de operações CAS para gerenciar o estado de sincronização.

AQS é uma estrutura para construir bloqueios e sincronizadores. AQS pode ser usada para construir de maneira fácil e eficiente um grande número de sincronizadores para uma ampla gama de aplicativos, como ReentrantLock, Semaphore e outros, como ReentrantReadWriteLock, SynchronousQueue, FutureTask, etc. É baseado em AQS.

 

19. AQS suporta dois métodos de sincronização:

(1) Cerimônia exclusiva

(2) Compartilhado

Isso torna mais fácil para os usuários implementarem diferentes tipos de componentes de sincronização, como tipos exclusivos como ReentrantLock, tipos compartilhados como Semaphore, CountDownLatch e tipos combinados como ReentrantReadWriteLock. Em suma, AQS fornece o suporte inferior para uso, como montar e realizar, os usuários podem jogar livremente.

 

 

20. O que é ReadWriteLock

Em primeiro lugar, deixe claro, não é que o ReentrantLock seja ruim, mas o ReentrantLock tem algumas limitações. Se você usar ReentrantLock, pode ser para evitar inconsistência de dados causada pelo thread A escrevendo dados e thread B lendo dados, mas desta forma, se o thread C estiver lendo dados e o thread D também estiver lendo dados, a leitura de dados não mudará os dados, então não há necessidade Bloqueando, mas ainda bloqueando, reduzindo o desempenho do programa. Por causa disso, o ReadWriteLock nasceu. ReadWriteLock é uma interface de bloqueio de leitura e gravação e ReentrantReadWriteLock é uma implementação específica da interface ReadWriteLock, que realiza a separação de leitura e gravação. O bloqueio de leitura é compartilhado e o bloqueio de gravação é exclusivo. Não há exclusão mútua entre leitura e gravação. Escrever e ler e escrever e escrever são mutuamente exclusivos, o que melhora o desempenho de leitura e escrita.

 

21. O que é FutureTask

Na verdade, isso foi mencionado antes, FutureTask representa uma tarefa de operação assíncrona. Uma classe de implementação específica de Callable pode ser passada para FutureTask, que pode esperar para obter o resultado da tarefa de operação assíncrona, determinar se ela foi concluída e cancelar a tarefa. Obviamente, como FutureTask também é uma classe de implementação da interface Runnable, FutureTask também pode ser colocado no pool de threads.

 

22, a diferença entre synchronized e ReentrantLock

Synchronized é a mesma palavra-chave que if, else, for, while e ReentrantLock é uma classe, que é a diferença essencial entre os dois. Como ReentrantLock é uma classe, ele fornece recursos cada vez mais flexíveis do que sincronizado. Ele pode ser herdado, pode ter métodos e pode ter uma variedade de variáveis ​​de classe. A escalabilidade de ReentrantLock do que sincronizada é refletida em vários pontos:

(1) ReentrantLock pode definir o tempo de espera para adquirir o bloqueio, de modo a evitar deadlock

(2) ReentrantLock pode obter várias informações de bloqueio

(3) ReentrantLock pode implementar de forma flexível várias notificações

Além disso, o mecanismo de bloqueio dos dois é realmente diferente. A camada inferior do ReentrantLock chama o método Unsafe park para travar, e a operação sincronizada deve ser a marca da palavra no cabeçalho do objeto. Não tenho certeza sobre isso.

 

23. O que é bloqueio otimista e bloqueio pessimista

(1) Bloqueio otimista: assim como seu nome, é otimista sobre os problemas de segurança de thread causados ​​por operações simultâneas. O bloqueio otimista acredita que a competição nem sempre ocorre, portanto, não é necessário segurar o bloqueio. Ele irá comparar e substituir os dois Esta ação é usada como uma operação atômica para tentar modificar as variáveis ​​na memória. Se falhar, significa que há um conflito e deve haver uma lógica de nova tentativa correspondente.

(2) Bloqueio pessimista: ainda como seu nome, é pessimista sobre problemas de segurança de thread causados ​​por operações simultâneas. O bloqueio pessimista acredita que a competição sempre ocorrerá, portanto, toda vez que um recurso é operado, ele manterá um exclusivo O bloqueio é como sincronizado, não importa se é três ou sete vinte e um, você pode operar o recurso diretamente ao bloqueá-lo.

 

24. Como o thread B sabe que o thread A modificou a variável?

(1) variável modificada volátil

(2) Método de modificação sincronizado para modificar variáveis

(3) esperar / notificar

(4) durante a votação

 

25, sincronizado, volátil, comparação CAS

(1) Sincronizado é um bloqueio pessimista, que é preventivo e fará com que outros threads sejam bloqueados.

(2) Volátil fornece visibilidade de variáveis ​​compartilhadas multithread e proíbe a otimização de reordenamento de instrução.

(3) CAS é um bloqueio otimista com base na detecção de conflito (sem bloqueio)

 

26. Qual é a diferença entre o método de sono e o método de espera?

Esta pergunta é freqüentemente feita. Tanto o método de suspensão quanto o método de espera podem ser usados ​​para desistir da CPU por um determinado período de tempo. A diferença é que se a linha de execução segurar o monitor de um objeto, o método de suspensão não desistirá do monitor desse objeto e o método de espera desistirá disso. Monitor de objeto

 

27. O que é ThreadLocal? Qual é a utilidade?

ThreadLocal é uma classe de ferramenta de variável de cópia de thread local. Ele é usado principalmente para mapear o encadeamento privado e o objeto de cópia armazenado pelo encadeamento, e as variáveis ​​entre os encadeamentos não interferem entre si. Em cenários de alta simultaneidade, chamadas sem estado podem ser realizadas, especialmente adequadas para valores de variáveis ​​que dependem de cada encadeamento. Cenário para conclusão da operação. Simplificando, ThreadLocal é uma forma de mudar o espaço para o tempo. Em cada Thread, um ThreadLocal.ThreadLocalMap implementado pelo método de endereço aberto é mantido. Os dados são isolados e não são compartilhados. Naturalmente, não há problema de segurança de thread.

 

28. Por que o método wait () e o método notificar () / notificarAll () devem ser chamados no bloco sincronizado

Isso é obrigatório pelo JDK. Ambos os métodos wait () e notificar () / notificarAll () devem adquirir o bloqueio do objeto antes de chamar

 

29. Quais são os métodos de sincronização multi-thread?

Palavra-chave sincronizada, implementação de bloqueio, bloqueio distribuído, etc.

 

30, estratégia de programação de discussão

O agendador de encadeamento seleciona o encadeamento com a prioridade mais alta para ser executado, mas ele encerrará o encadeamento se ocorrerem as seguintes condições:

(1) O método de rendimento é chamado no corpo da rosca para desistir do direito de ocupar a cpu

(2) O método sleep é chamado no corpo do fio para fazer o fio dormir

(3) O thread está bloqueado devido à operação IO

(4) Outro tópico de maior prioridade aparece

(5) Em um sistema que suporta fatias de tempo, a fatia de tempo do segmento se esgota

31. Qual é a simultaneidade de ConcurrentHashMap

A simultaneidade de ConcurrentHashMap é o tamanho do segmento. O padrão é 16, o que significa que até 16 threads podem operar ConcurrentHashMap ao mesmo tempo. Essa também é a maior vantagem de ConcurrentHashMap sobre Hashtable. Em qualquer caso, Hashtable pode ter dois threads para obter Hashtable ao mesmo tempo. Dados?

 

32. Como descobrir qual thread usa a CPU mais longa no ambiente Linux

(1) Obtenha o pid, jps ou ps -ef | grep java do projeto

(2) top -H -p pid, a ordem não pode ser alterada

 

33. Impasse Java e como evitá-lo?

Um conflito em Java é uma situação de programação na qual dois ou mais encadeamentos são bloqueados permanentemente.Uma situação de impasse em Java ocorre com pelo menos dois encadeamentos e dois ou mais recursos.

A causa raiz do impasse em Java é: um aplicativo de loop fechado cruzado ocorreu ao solicitar um bloqueio.

 

34, a causa do impasse

(1) Múltiplos threads envolvem múltiplos bloqueios, e esses bloqueios são cruzados, portanto, pode levar a um loop fechado de dependência de bloqueio.

Por exemplo: Um thread se aplica ao bloqueio B quando adquiriu o bloqueio A e não o liberou. Nesse momento, outro thread adquiriu o bloqueio B e deve adquirir o bloqueio A antes de liberar o bloqueio B. Portanto, o loop fechado ocorre e ele cai em um loop de deadlock. .

(2) A operação de solicitação de bloqueio padrão é o bloqueio.

Portanto, para evitar deadlock, é necessário revisar cuidadosamente todos os métodos nas classes desses objetos quando há vários bloqueios de objeto se cruzando, se há a possibilidade de loops que causam dependência de bloqueio. Resumindo, tente evitar chamar métodos de atraso e métodos de sincronização de outros objetos em um método sincronizado.

 

35. Como despertar um tópico bloqueado

Se o thread for bloqueado chamando wait (), sleep () ou join (), você pode interromper o thread e ativá-lo lançando InterruptedException; se o thread encontrar o bloqueio de IO, nada poderá ser feito, porque IO é o sistema operacional Percebi que não há como o código Java tocar diretamente no sistema operacional.

 

36. Como os objetos imutáveis ​​ajudam no multithreading?

Há um problema mencionado anteriormente. Objetos imutáveis ​​garantem a visibilidade da memória do objeto. A leitura de objetos imutáveis ​​não requer meios adicionais de sincronização, o que melhora a eficiência da execução do código.

 

37. O que é a troca de contexto multi-threaded

A troca de contexto multi-threaded se refere ao processo no qual o controle da CPU é trocado de um thread já em execução para outro thread que está pronto e aguardando para obter os direitos de execução da CPU.

 

38. O que acontece se a fila do pool de threads estiver cheia quando você enviar uma tarefa

Distinguir aqui:

(1) Se você estiver usando uma fila ilimitada LinkedBlockingQueue, ou seja, uma fila ilimitada, não importa, continue adicionando tarefas à fila de bloqueio para aguardar a execução, porque LinkedBlockingQueue pode ser considerada como uma fila infinita, que pode armazenar tarefas infinitamente

(2) Se você estiver usando uma fila limitada, como ArrayBlockingQueue, a tarefa será adicionada primeiro a ArrayBlockingQueue. Quando a ArrayBlockingQueue estiver cheia, o número de threads aumentará de acordo com o valor de maximumPoolSize. Se o número de threads for aumentado, o número de threads ainda não poderá ser processado e a ArrayBlockingQueue estará cheia, então Ele usará a política rejeitada RejectedExecutionHandler para processar todas as tarefas, o padrão é AbortPolicy

 

39. Qual é o algoritmo de escalonamento de thread usado em Java

Preventivo. Depois que um thread fica sem CPU, o sistema operacional calculará uma prioridade total com base na prioridade do thread, falta de thread e outros dados e alocará a próxima fatia de tempo a um thread para execução.

 

 

40. O que é agendador de thread (Thread Scheduler) e divisão de tempo (TimeSlicing)?

O agendador de threads é um serviço do sistema operacional responsável por alocar o tempo da CPU para threads no estado Executável. Uma vez que criamos um thread e o iniciamos, sua execução depende da implementação do agendador de threads. A divisão de tempo refere-se ao processo de alocação de tempo de CPU disponível para threads executáveis ​​disponíveis. A alocação do tempo de CPU pode ser baseada na prioridade do thread ou no tempo de espera do thread. O agendamento de thread não é controlado pela máquina virtual Java, portanto, é uma escolha melhor controlá-lo pelo aplicativo (ou seja, não deixe seu programa depender da prioridade do thread).

 

41, o que é spin

Muitos códigos sincronizados são apenas códigos simples e o tempo de execução é muito rápido.Neste momento, a espera de threads bloqueados pode ser uma operação inútil, porque o bloqueio de threads envolve alternar entre o modo de usuário e o modo kernel. Uma vez que o código em synchronized executa muito rápido, deixe o thread que espera pelo bloqueio não ser bloqueado, mas faça um loop ocupado no limite de synchronized, que é o giro. Se você fizer vários ciclos ocupados e descobrir que o bloqueio não foi obtido, bloqueie novamente.Esta pode ser uma estratégia melhor.

 

42. O que é a interface Lock na API Java Concurrency? Quais são suas vantagens sobre a sincronização?

A interface de bloqueio fornece operações de bloqueio mais escalonáveis ​​do que métodos de sincronização e blocos de sincronização. Eles permitem estruturas mais flexíveis, podem ter propriedades completamente diferentes e podem suportar vários tipos relacionados de objetos condicionais.

Suas vantagens são:

(1) Pode tornar o bloqueio mais justo

(2) O thread pode responder a interrupções enquanto espera pelo bloqueio

(3) Você pode deixar o thread tentar adquirir o bloqueio e retornar imediatamente ou aguardar por um período de tempo quando o bloqueio não pode ser adquirido

(4) Os bloqueios podem ser adquiridos e liberados em diferentes intervalos e em diferentes ordens

 

43. Segurança de thread do modo singleton

A questão antiquada, a primeira coisa a dizer é que a segurança de thread do modo singleton significa que uma instância de uma determinada classe será criada apenas uma vez em um ambiente multithread. Há muitas maneiras de escrever o modo singleton, deixe-me resumir:

(1) A escrita do faminto padrão chinês singleton: thread safety

(2) O método de escrita do padrão singleton preguiçoso: não thread-safe

(3) A gravação do modo singleton de bloqueio de verificação dupla: thread safety

 

44. Qual é o papel do Semaphore

O semáforo é um semáforo, sua função é limitar o número de blocos de código simultâneos. O semáforo tem um construtor que pode passar um inteiro do tipo int n, o que significa que um determinado trecho de código só pode ser acessado por n threads, no máximo. Se exceder n, aguarde até que um determinado thread termine de executar este bloco de código e o próximo thread Entre novamente. Pode-se ver que se o inteiro do tipo int n = 1 passado no construtor Semaphore, é equivalente a se tornar um sincronizado.

 

45. O que é a classe Executors?

Executors fornece alguns métodos de ferramenta para as classes Executor, ExecutorService, ScheduledExecutorService, ThreadFactory e Callable. Os executores podem ser usados ​​para criar pools de threads facilmente

 

46. ​​Qual thread o construtor da classe de thread e o bloco estático são chamados?

Esta é uma pergunta muito complicada e astuta. Lembre-se: o método de construção e o bloco estático da classe de thread são chamados pelo thread em que a classe de thread é nova, e o código do método run é chamado pelo próprio thread.

Se a declaração acima o confunde, deixe-me dar um exemplo: Supondo que Thread1 seja novo no Thread2 e Thread2 seja novo na função principal, então:

(1) O método de construção e o bloco estático de Thread2 são chamados pelo thread principal, e o método run () de Thread2 é chamado pelo próprio Thread2

(2) O método de construção e o bloco estático de Thread1 são chamados por Thread2, e o método run () de Thread1 é chamado pelo próprio Thread1

 

47. Qual é a melhor escolha, método de sincronização ou bloco de sincronização?

Bloco síncrono, o que significa que o código fora do bloco síncrono é executado de forma assíncrona, o que melhora a eficiência do código mais do que todo o método de sincronização. Conheça um princípio: quanto menor o escopo da sincronização, melhor.

 

48. Quais exceções podem ser causadas por muitos encadeamentos Java?

(1) A sobrecarga do ciclo de vida dos threads é muito alta

(2) Consumir muitos recursos da CPU

Se o número de threads executáveis ​​for maior que o número de processadores disponíveis, alguns threads ficarão ociosos. Um grande número de encadeamentos ociosos ocupará muita memória, colocando pressão no coletor de lixo, e um grande número de encadeamentos também produzirá outra sobrecarga de desempenho ao competir por recursos da CPU.

(3) Reduz a estabilidade

A JVM tem um limite no número de encadeamentos que podem ser criados. Esse valor limite varia com diferentes plataformas e está sujeito a vários fatores, incluindo parâmetros de inicialização da JVM, o tamanho da pilha de solicitações no construtor de encadeamentos e a operação subjacente Restrições do sistema em threads, etc. Se essas restrições forem quebradas, um OutOfMemoryError pode ser lançado.


Em resposta aos pontos de conhecimento solicitados na entrevista acima, resumi a maioria das perguntas e respostas da entrevista envolvidas na entrevista do programador Java da empresa de Internet. Documentos e materiais de arquitetura são compartilhados com todos, na esperança de ajudá-lo a revisar antes da entrevista E encontrar um bom emprego também economiza o tempo de todos na busca de informações na Internet para aprender

O que se segue é um processo demorado de três meses para resolver quase mil perguntas da entrevista Java para várias empresas em 2020 e mais de 400 páginas de documentos PDF, cobrindo: Java, MyBatis, ZooKeeper, Dubbo, Elasticsearch, Memcached, Redis, MySQL, Spring, Spring Boot, Spring Cloud, RabbitMQ, Kafka, Linux e outras pilhas de tecnologia

 

Amigos que desejam obter este pdf completo: Depois de gostar, você pode enviar uma mensagem privada [documento de entrevista] (certifique-se de prestar atenção em mim, caso contrário, não haverá como responder a mensagens privadas de estranhos)

 

 

 

Acho que você gosta

Origin blog.csdn.net/bjmsb/article/details/108733025
Recomendado
Clasificación