Abaixo estão as perguntas populares da entrevista relacionadas aos threads java, você pode usá -los para se preparar para a entrevista.
1) O que é um tópico?
Um encadeamento é a menor unidade que o sistema operacional pode executar operações e programação. Está contido no processo e é a unidade operacional real no processo. Os programadores podem programar multiprocessadores por meio dele e você pode acelerar tarefas com uso intensivo de operação usando o Multithreading. Por exemplo, se for necessário 100 milissegundos para um thread para concluir uma tarefa, são necessários apenas 10 milissegundos para um thread para concluir a mudança de tarefa usando dez threads. O Java oferece excelente suporte para multithreading no nível do idioma e também é um bom ponto de venda. Para mais detalhes, clique aqui.
2) Qual é a diferença entre um thread e um processo?
Os threads são subconjuntos de processos. Um processo pode ter muitos threads e cada thread executa tarefas diferentes em paralelo. Processos diferentes usam espaços de memória diferentes, enquanto todos os threads compartilham o mesmo espaço de memória. Não mexa na memória da pilha, cada encadeamento possui uma memória de pilha separada para armazenar dados locais. Para mais detalhes, clique aqui.
3) Como implementar threads em Java?
Existem duas maneiras no nível do idioma. Uma instância da classe java.lang.thread é um thread, mas precisa chamar a interface java.lang.runnable para executar. Como a classe Thread em si é a interface executável chamada, você pode herdar a classe java.lang.thread ou chamar diretamente a interface executável para substituir o método run () para implementar o thread. Para mais detalhes, clique aqui.
4) Use Runnable ou Thread?
Esta pergunta é um acompanhamento da pergunta anterior. Todo mundo sabe que podemos implementar threads herdando a classe Thread ou chamando a interface executável. A questão é: qual método é melhor? Em que circunstâncias devo usá -lo? Essa pergunta é fácil de responder se você souber que o Java não suporta a herança múltipla de classes, mas permite que você chame várias interfaces. Portanto, se você deseja herdar outras classes, é claro, é melhor chamar a interface executável. Para mais detalhes, clique aqui.
6) Qual é a diferença entre os métodos START () e RUN () na classe Thread?
Essa pergunta é frequentemente feita, mas ainda pode distinguir o entendimento do entrevistador sobre o modelo de Threading Java. O método start () é usado para iniciar o thread recém -criado, e o método run () é chamado internamente, o que é diferente do efeito de chamar diretamente o método run (). Quando você chama o método run (), ele só será chamado no thread original. Se nenhum novo thread for iniciado, o método START () iniciará o novo thread. Para mais discussões, clique aqui
7) Qual é a diferença entre executável e chamável em Java?
Runnable e Callable representam tarefas a serem executadas em diferentes threads. O Runnable está disponível desde o JDK1.0, e o chamável foi adicionado no JDK1.5. A principal diferença é que o método de chamada () de chamada pode retornar valores e lançar exceções, enquanto o método Run () Runnable não possui essas funções. Callable pode retornar um objeto futuro carregado com os resultados do cálculo. Meu blog tem instruções mais detalhadas.
8) Qual é a diferença entre CyclicBarrier e Countdownlatch em Java?
Tanto o CyclicBarrier quanto o CountdownLatch podem ser usados para fazer com que um grupo de threads aguarde outros threads. Ao contrário do CyclicBarrier, o CountdownLatch não pode ser reutilizado. Clique aqui para ver mais informações e código de exemplo.
9) Qual é o modelo de memória Java?
O modelo de memória Java especifica e guia os programas Java para se comportar deterministicamente entre diferentes arquiteturas de memória, CPUs e sistemas operacionais. É especialmente importante em situações de threading. O modelo de memória Java pode garantir que as alterações feitas por um thread sejam visíveis para outros threads e os relacionamentos ocorram primeiro. Esse relacionamento define algumas regras para tornar os programadores mais claros em sua programação simultânea. Por exemplo, ter um relacionamento garante primeiro:
O código dentro dos threads pode ser executado em sequência, que é chamado de Regras de Ordem do Programa.
Para o mesmo bloqueio, uma operação de desbloqueio deve ocorrer antes de outra operação de bloqueio que ocorre no tempo, que também é chamada de regra de bloqueio de gerenciamento.
A operação de gravação anterior para um volátil é antes da próxima operação de leitura de um volátil, que também é chamado de regra variável volátil.
Qualquer operação dentro de um encadeamento deve ser chamada após o início () deste thread, também conhecido como regra de inicialização do thread.
Todas as operações de um encadeamento serão encerradas antes que o encadeamento termine.
A operação de terminação de um objeto deve estar após a construção do objeto, que também é chamado de regra de terminação do objeto.
Transitivo
Eu recomendo fortemente que você leia o capítulo 16 da "prática de programação de simultaneidade Java" para aprofundar sua compreensão do modelo de memória Java.
10) Qual é a variável volátil em Java?
O VOLATILE é um modificador especial que só pode ser usado pelas variáveis de membro. No caso em que os programas simultâneos Java não possuem classes síncronas, as operações de multithreading nas variáveis de membros são transparentes para outros threads. A variável volátil pode garantir que a próxima operação de leitura ocorra após a operação de gravação anterior, que é a regra variável volátil da pergunta anterior. Clique aqui para ver conteúdo mais volátil relacionado.
11) O que é a segurança do thread? O vetor é uma classe segura para threads? (Veja aqui para obter detalhes)
Se o seu código estiver no processo em que você estiver, existem vários threads em execução ao mesmo tempo e esses threads poderão executar esse código ao mesmo tempo. Se o resultado de cada execução for o mesmo que o resultado de uma única linha de encadeamento, e os valores de outras variáveis são os mesmos que o esperado, ela é segura por thread. O mesmo objeto de instância de uma classe de contador à prova de encadeamento não causará erros de cálculo quando usado por vários threads. Obviamente, você pode dividir a classe de coleção em dois grupos, seguros para threads e não segura. O vetor usa métodos de sincronização para atingir a segurança do encadeamento, enquanto o Arraylist semelhante a ele não é seguro para roscas.
12) Quais são as condições de corrida em Java? Dê um exemplo.
As condições de corrida farão com que alguns bugs ocorram em situações simultâneas do programa. Quando a multi-threading competir por alguns recursos, as condições de raça surgirão. Se o primeiro programa a ser executado falhar e for executado posteriormente, alguns bugs incertos aparecerão em todo o programa. Esses bugs são difíceis de detectar e recorrer devido à concorrência aleatória entre threads. Um exemplo é o processamento desordenado, consulte a resposta para obter detalhes.
13) Como parar um tópico em java?
O Java fornece uma API rica, mas não fornece uma API para interromper os threads. O JDK 1.0 originalmente possuía alguns métodos de controle como STOP (), Suspender () e Resume (), mas, devido a possíveis ameaças de impasse, eles foram preteridos nas versões JDK subsequentes. Depois disso, o designer da API Java não forneceu uma maneira compatível e segura por threads para parar um thread. Quando o método Run () ou Call () é executado, o thread termina automaticamente. Se você deseja encerrar um encadeamento manualmente, pode usar a variável booleana volátil para sair do loop do método run () ou cancelar a tarefa para interromper o thread. Clique aqui para visualizar o código de exemplo.
14) O que acontece quando ocorre uma exceção quando um thread está em execução?
Esta é uma pergunta muito complicada da entrevista em Java que encontrei em uma entrevista. Simplificando, se a exceção não for capturada, o tópico parará de executar.
Thread.uncaughtexceptionHandler é uma interface incorporada para lidar com exceções não capturadas que causam interrupção súbita do encadeamento. Quando uma exceção não capturada faz com que um thread interrompa, a JVM usará Thread.getuncaughtexceptionHandler () para consultar o thread UndexceptionHandler e passar o thread e a exceção como parâmetros ao método UNJUGHTEXCECPEÇÃO () do Handler para processamento.
15) Como compartilhar dados entre dois threads?
Você pode fazer isso compartilhando objetos ou usar estruturas de dados simultâneas, como bloquear filas. Este tutorial, "Java Inter-Thread Communication" (que envolve o compartilhamento de objetos entre dois threads) usa os métodos de espera e notificar para implementar o modelo de consumidor do produtor.
16) Qual é a diferença entre notificar e notificar todos em java?
Esse é outro problema complicado, porque o multithreading pode aguardar bloqueios de monitoramento único, e os designers de API Java fornece algumas maneiras de notificá -las ao aguardar as condições mudarem, mas esses métodos não são totalmente implementados. O método notify () não pode acordar um thread específico, portanto, só funcionará quando um thread estiver esperando. E notifyAll () acorda todos os threads e permite que eles competam por bloqueios para garantir que pelo menos um thread possa continuar sendo executado. Meu blog tem informações mais detalhadas e código de amostra.
17) Por que esperar, notificar e notificar todos os métodos que não estão na aula de threads?
Esta é uma pergunta relacionada ao design que examina a percepção do entrevistador sobre os sistemas existentes e algo que é comum, mas parece irracional. Ao responder a essas perguntas, você precisa explicar por que faz sentido colocar esses métodos na classe de objeto e por que não colocá -los na classe de threads. Uma razão óbvia é que os bloqueios fornecidos pelo Java são no nível do objeto, em vez de no nível do encadeamento, e cada objeto possui uma trava, obtida através de threads. Se o thread precisar esperar por alguns bloqueios, faz sentido chamar o método Wait () no objeto. Se o método wait () for definido na classe Thread, não será óbvio qual bloquear o encadeamento está esperando. Simplificando, desde que espere, notifique e notificar todos são operações no nível da bloqueio, elas são definidas na classe de objeto porque o bloqueio pertence ao objeto. Você também pode conferir este artigo para saber mais.
18) O que é uma variável Threadlocal?
Threadlocal é uma variável especial em Java. Cada encadeamento possui um threadlocal, o que significa que cada thread possui sua própria variável independente e as condições de corrida são completamente eliminadas. É uma ótima maneira de ser seguro para criar objetos caros. Por exemplo, você pode usar o ThreadLocal para fazer com que o simpledEformat se segura, porque essa classe é cara para criar e requer a criação de uma instância diferente para cada chamada, portanto, não vale a pena usá-la localmente. Se você fornecer a cada thread uma cópia exclusiva de variáveis, ele melhorará bastante a eficiência. Primeiro, o número de objetos caros criados é reduzido pela multiplexação. Segundo, você ganha segurança no thread sem usar sincronização ou invariância dispendiosa. Outro bom exemplo de variáveis locais de encadeamento é a classe ThreadLocalRandom, que reduz o número de objetos aleatórios caros criados em um ambiente multithread. Veja as respostas para saber mais.
19) O que é o FutureTask?
Em um programa concorrente Java, o FutureTask representa uma operação assíncrona que pode ser cancelada. Possui métodos como operações de partida e cancelamento, consulta se as operações são concluídas e recuperando os resultados da operação. O resultado só pode ser recuperado quando a operação é concluída. Se a operação não tiver concluído, o método GET será bloqueado. Um objeto FutureTask pode envolver objetos que chamam chamáveis e executáveis. Como o FutureTask também chama a interface executável, ele pode ser enviado ao executor para execução.
20) Qual é a diferença entre os métodos interrompidos e ISInterruptedd em Java?
A principal diferença entre interrompida () e iSiSinterrupted () é que o primeiro limpará o estado de interrupção, enquanto o último não o fará. O mecanismo de interrupção do multithreading Java é implementado com identificadores internos. Chamando thread.interrupt () para interromper um thread definirá o identificador de interrupção como true. Quando o encadeamento de interrupção chama o encadeamento do método estático. O método não estático é interrompido () é usado para consultar o status de interrupção de outros threads sem alterar o identificador de status de interrupção. Simplificando, qualquer método que lança uma interrupção limpará o estado de interrupção. De qualquer forma, o estado de interrupção de um encadeamento pode ser alterado por outros threads que chamam interrupções.
21) Por que esperar e notificar os métodos precisam ser chamados em um bloco síncrono?
Isso ocorre principalmente porque a API Java força isso e, se não o fizer, seu código lançará uma exceção ilegalMonitorStateException. Outro motivo é evitar condições de raça entre espera e notificar.
22) Por que você deve verificar as condições de espera no loop?
Os tópicos no estado de espera podem receber alertas de erro e pseudo-acidras. Se a condição de espera não for verificada no loop, o programa sairá sem atender à condição final. Portanto, quando um tópico em espera acorda, não se pode considerar que seu estado de espera original ainda é válido e pode mudar durante esse período após o método notify () e antes do tópico de espera acordar. É por isso que o método Wait () em um loop funciona melhor, você pode criar modelos no Eclipse para ligar para esperar e notificar e tentar. Se você quiser saber mais sobre esse problema, recomendo que você leia os capítulos de encadeamento e sincronização no livro "Effeitor Java".
23) Qual é a diferença entre coleções síncronas e coleções simultâneas em Java?
Tanto as coleções síncronas quanto as coleções simultâneas fornecem coleções adequadas à prova de roscas para multithreading e simultaneidade, mas as coleções simultâneas são mais escaláveis. Antes do Java 1.5, os programadores usavam apenas coleções síncronas e, quando a concorrência com vários threads estava contribuindo, levaria à contenção, impedindo a escalabilidade do sistema. O Java5 apresenta coleções simultâneas como o ConcurrentHashMap, que não apenas fornece segurança de threads, mas também melhora a escalabilidade com tecnologias modernas, como separação de bloqueio e zonas internas. Veja a resposta para obter mais detalhes.
24) Qual é a diferença entre Heap e Stack em Java?
Por que essa pergunta é classificada em perguntas de entrevista multithread e simultânea? Porque a pilha é uma área de memória intimamente relacionada ao thread. Cada encadeamento possui sua própria memória de pilha, usada para armazenar variáveis locais, parâmetros de método e chamadas de pilha. As variáveis armazenadas em um encadeamento são invisíveis para outros threads. A pilha é uma área de memória comum compartilhada por todos os threads. Os objetos são criados no heap. Para melhorar a eficiência, o encadeamento armazenará A do heap para sua própria pilha. Se vários threads usarem essa variável, ela pode causar problemas. Neste momento, a variável volátil pode desempenhar um papel, o que exige que o encadeamento leia o valor da variável da memória principal.
Veja a resposta para obter mais detalhes.
25) O que é um pool de threads? Por que usá -lo?
Criar tópicos leva recursos e tempo caros. Se um thread for criado somente após a tarefa chegar, o tempo de resposta ficará mais longo e um processo poderá criar um número limitado de threads. Para evitar esses problemas, vários threads são criados para responder e processar quando o programa é iniciado. Eles são chamados de piscinas de threads, e os threads internos são chamados de threads trabalhadores. Começando com o JDK1.5, a API Java fornece a estrutura do executor que permite criar diferentes pools de threads. Por exemplo, um único pool de threads, que lida com uma tarefa de cada vez; Um número fixo de pools de threads ou pools de threads de cache (um pool de threads extensíveis adequado para muitos programas com tarefas de curta duração). Veja este artigo para obter mais detalhes.
26) Como escrever código para resolver o produtor e os problemas do consumidor?
Na realidade, muitos dos problemas de threads que você resolve pertencem ao modelo de consumidor do produtor, que é que uma tarefa de produção de threads é para consumo por outros threads. Você deve saber como se comunicar entre threads para resolver esse problema. O método de nível relativamente baixo é usar o Wait and Notify para resolver esse problema. O método mais excelente é usar o semáforo ou o BlockingQueue para implementar o produtor e o modelo de consumidor. Este tutorial o implementa.
27) Como evitar impasse?
Deadlock em Java Multithreading
Deadlock refere -se a um fenômeno de espera mútua causada por dois ou mais processos durante o processo de execução devido à competição por recursos. Sem forças externas, elas não poderão continuar. Esse é um problema sério, porque os impasses tornarão seu programa suspender e não conseguir concluir a tarefa. As quatro condições a seguir devem ser atendidas para a ocorrência de impasse:
Condição de exclusão mútua: um recurso só pode ser usado por um processo por vez.
Condições de solicitação e retenção: Quando um processo bloqueia devido à solicitação de recursos, mantém os recursos adquiridos.
Condições para não privar: Os recursos obtidos pelo processo não podem ser privados à força até o final do uso.
Condições de espera de loop: Um relacionamento de recursos de espera em loop é formado entre vários processos conectados na cabeça e na cauda.
A maneira mais fácil de evitar impasses é evitar condições de espera de loop, definir bandeiras e classificar todos os recursos do sistema e estipular que todos os recursos de aplicação do processo devem ser operados em uma determinada ordem (ordem ascendente ou descendente) para evitar impasses. Este tutorial possui exemplos de código e detalhes de discussão sobre como evitar impasses.
28) Qual é a diferença entre fechaduras ao vivo e impasse em Java?
Esta é a extensão da pergunta anterior. As fechaduras vivas são semelhantes aos impasse. A diferença é que o estado do encadeamento ou processo na trava ao vivo está mudando constantemente. As fechaduras vivas podem ser consideradas um tipo especial de fome. Um exemplo realista de uma fechadura ao vivo é quando duas pessoas se encontram em um corredor estreito. Ambos tentam evitar um ao outro para que um ao outro possa passar, mas como a direção de evitar é a mesma, ninguém pode passar pelo corredor no final. Simplificando, a principal diferença entre uma trava ao vivo e uma trava morta é que o estado do processo anterior pode ser alterado, mas não pode ser executado.
29) Como detectar se um thread tem um bloqueio?
Eu nunca soube que poderíamos realmente detectar se um tópico tivesse uma fechadura até eu participar de uma entrevista por telefone. Existe um método em java.lang.thread chamado holdslock (), que retorna true se e somente se o encadeamento atual possuir um bloqueio para um objeto específico. Você pode conferir este artigo para saber mais.
30) Como você consegue pilha de threads em java?
Para diferentes sistemas operacionais, existem várias maneiras de obter a pilha de threads dos processos Java. Quando você obtém a pilha de threads, a JVM armazenará o estado de todos os threads no arquivo de log ou a produzirá para o console. No Windows, você pode usar a combinação de teclas Ctrl + Break para obter a pilha de threads e usar o comando Kill -3 no Linux. Você também pode usar a ferramenta jstack para obtê -la, que opera nos IDs do thread, e você pode usar a ferramenta JPS para encontrar o ID.
31) Qual parâmetro na JVM é usado para controlar a pilha de threads com uma pequena pilha
Esse problema é muito simples, o parâmetro -xss é usado para controlar o tamanho da pilha do encadeamento. Você pode visualizar a lista de configuração da JVM para obter mais informações sobre este parâmetro.
32) Qual é a diferença entre sincronizado e reentrantlock em Java?
O Java conseguiu obter exclusão mútua há muito tempo através de palavras -chave sincronizadas e tem algumas desvantagens. Por exemplo, você não pode expandir métodos ou bloquear limites além de bloqueios e não pode cancelar a metade do caminho ao tentar adquirir bloqueios, etc. O Java 5 fornece controles mais complexos para resolver esses problemas através da interface de bloqueio. A classe Reentrantlock implementa Lock, que tem a mesma semântica de simultaneidade e memória que sincronizada e também é extensível. Você pode conferir este artigo para saber mais
33) Existem três fios T1, T2 e T3. Como garantir que eles sejam executados em ordem?
Existem muitas maneiras de permitir que os threads sejam executados em uma ordem específica no multithreading. Você pode usar o método de ingresso () da classe Thread para iniciar outro thread em um thread, e outro thread conclui o thread para continuar a execução. Para garantir a ordem de três threads, você deve iniciar o último (T3 chama T2, T2 Chamadas T1), para que o T1 seja concluído primeiro e o T3 será concluído pelo último. Você pode conferir este artigo para saber mais.
34) Qual é a função do método de rendimento na classe Thread?
O método de rendimento pode pausar o objeto Thread atualmente executando e permitir outros threads com a mesma prioridade executar. É um método estático e garante apenas que o thread atual cede o uso da CPU e não possa garantir que outros threads possam ocupar a CPU. O rendimento de execução do thread () pode ser executado imediatamente após a entrada no estado pausado. Clique aqui para ver mais sobre o método de rendimento.
35) Qual é a simultaneidade do concorrente em Java?
Concurrenthashmap divide o mapa real em várias partes para atingir sua escalabilidade e segurança da linha. Esta divisão é obtida usando a concorrência, que é um parâmetro opcional para o construtor de classe ConcurrentHashmap, com um valor padrão de 16, para que a disputa possa ser evitada em situações multithreading. Para obter mais concorrência e redimensionamento interno, leia meu artigo como funciona o ConcurrentHashMap em Java.
36) O que é Semáforo em Java?
Semáforo em Java é uma nova classe de sincronização, que é um sinal de contagem. Conceitualmente, conceitualmente, o semáforo mantém um conjunto de licenças. Se necessário, cada adquirir () será bloqueado antes que a licença esteja disponível antes de ser obtida. Cada versão () adiciona uma permissão, que pode liberar um adquirente de bloqueio. No entanto, sem usar o objeto de licença real, o semáforo conta apenas os números de licença disponível e toma ações correspondentes. Os semáforos são frequentemente usados em código multithread, como pools de conexão de banco de dados. Para mais detalhes, clique aqui.
37) Se você enviar uma tarefa, a fila do pool de threads estará cheia. O que acontece quando acontece?
Esta questão é astuta e muitos programadores pensarão que a tarefa será bloqueada até que a fila do pool de threads tenha espaço. De fato, se uma tarefa não puder ser programada para ser executada, o método Submit () ThreadPoolExecutor lançará uma exceção rejeitExecutionException.
38) Qual é a diferença entre os métodos Submit () e Execute () no Java Thread Pool?
Ambos os métodos podem enviar tarefas ao pool de threads. O método de retorno do Execute () é nulo, que é definido na interface do executor, e o método submit () pode retornar o objeto futuro que mantém os resultados do cálculo. É definido na interface ExecorService. Estende a interface do executor. Outras classes do pool de threads, como ThreadPoolExector e ScheduledThreadpoolExector, têm esses métodos. Para mais detalhes, clique aqui.
39) O que é um método de bloqueio?
Um método de bloqueio significa que o programa aguardará a conclusão do método e não faz mais nada. O método Acept () do ServerSocket é aguardar o cliente se conectar. Bloquear aqui significa que o encadeamento atual será suspenso antes que o resultado da chamada seja retornado e não retornará até que o resultado seja obtido. Além disso, existem métodos assíncronos e não bloqueadores que retornam antes que a tarefa seja concluída. Para mais detalhes, clique aqui.
40) é segura para o fio? Por que?
Você pode dar uma resposta positiva, o Swing não é seguro para fios, mas deve explicar por que essa resposta é mesmo que o entrevistador não lhe pergunte o porquê. Quando dizemos que o swing não é seguro para roscas, muitas vezes menciona seus componentes, que não podem ser modificados no multi-threaded. Todas as atualizações dos componentes da GUI devem ser concluídas nos threads AWT. O Swing fornece dois métodos de retorno de chamada síncronos e assíncronos para atualizar. Clique aqui para ver mais conteúdo relacionado à segurança de swing e thread.
41) Qual é a diferença entre InvoKeandwait e Invokelater em Java?
Esses dois métodos são fornecidos pela API Swing para os desenvolvedores Java para atualizar os componentes da GUI a partir do encadeamento atual, em vez do thread de expedição de eventos. InvoKeandWait () atualiza componentes de GUI de forma síncrona, como uma barra de progresso. Depois que o progresso é atualizado, a barra de progresso também deve ser alterada de acordo. Se o progresso for rastreado por vários threads, o método InvoKeandWait () será chamado para solicitar o thread de despacho de evento para atualizar o componente de acordo. O método Invokelater () é chamado de forma assíncrona para atualizar o componente. Para mais detalhes, clique aqui.
42) Quais métodos na API de swing são seguros de threads?
Esta questão também menciona a segurança de balanço e threads. Embora os componentes não sejam seguros de threads, existem alguns métodos que podem ser chamados de múltiplas tintas, como Repaint () e Revalidate (). O método setText () do JTextComponent e os métodos insert () e append () de jtextarea também são seguros de threads.
43) Como criar um objeto imutável em Java?
Esse problema parece não ter nada a ver com multi-threading, mas a invariância ajuda a simplificar programas simultâneos já complexos. Objetos imutáveis podem ser compartilhados sem sincronização, reduzindo a sobrecarga de sincronização quando o acesso simultâneo ao objeto. No entanto, Java não possui a anotação @imutável. Para criar uma classe imutável, precisamos implementar as seguintes etapas: Inicialize todos os membros por meio de um construtor, não forneça um método Setter para a variável e declare todos os membros como privados, para que esses membros não possam ser acessados diretamente. No método getter, não retorne diretamente o próprio objeto, mas clone o objeto e retorne uma cópia do objeto. Meu artigo como tornar um objeto imutável em Java tem tutoriais detalhados e você pode estar cheio de confiança depois de lê -lo.
44) O que é readwritelock em java?
De um modo geral, os bloqueios de leitura e gravação são o resultado da tecnologia de separação de bloqueio usada para melhorar o desempenho de programas simultâneos. ReadWritelock em Java é uma nova interface adicionada no Java 5. Um ReadWritelock mantém um par de bloqueios associados, um para operações somente leitura e outra para gravações. Um bloqueio de leitura pode ser mantido por vários threads de leitura ao mesmo tempo sem um thread de gravação. Os bloqueios de gravação são exclusivos, você pode implementar esta regra usando o ReentrantreadWritelock no JDK, que suporta até 65535 bloqueios de gravação e 65535 LEAD Locks.
45) O que é um loop ocupado no multithreading?
Loops ocupados são quando os programadores usam loops para fazer um thread esperar. Ao contrário dos métodos tradicionais como Wait (), Sleep () ou Rendimento (), todos desistem do controle da CPU, enquanto os loops ocupados não desistem da CPU, ela está apenas executando um loop vazio. O objetivo disso é preservar o cache da CPU. Em um sistema de vários núcleos, um espera para que um thread acorde possa ser executado em outro kernel, que reconstruirá o cache. Está disponível para evitar a reconstrução do cache e reduzir o tempo aguardando a reconstrução. Você pode verificar este artigo para obter mais informações.
46) Qual é a diferença entre variáveis voláteis e variáveis atômicas?
Esta é uma pergunta interessante. Primeiro, a variável volátil se parece muito com a variável atômica, mas as funções são diferentes. A variável volátil garante um relacionamento antecessor, ou seja, as operações de gravação ocorrerão antes das operações de leitura subsequente, mas não garante atomicidade. Por exemplo, modificando a variável de contagem com volátil, a operação Count ++ não é atômica. O método atômico fornecido pela classe AtomicInteger pode tornar essa operação atômica. Por exemplo, o método getAndIncrement () executará operações de incremento atômico para adicionar o valor atual por um, e outros tipos de dados e variáveis de referência também podem executar operações semelhantes.
47) O que acontece se um thread dentro de um bloco de sincronização lançar uma exceção?
Esta pergunta enganou muitos programadores Java. Se você consegue pensar se o bloqueio libera essa pista para responder, ainda espera respondê -la corretamente. Não importa se o seu bloco de sincronização sai normalmente ou anormalmente, os threads internos liberarão o bloqueio, então eu prefiro o bloco de sincronização em comparação com a interface de bloqueio, pois não exige que eu gaste minha energia para liberar o bloqueio. Esta função pode ser implementada liberando o bloqueio finalmente.
48) Qual é o bloqueio de verificação dupla no modo Singleton?
Essa pergunta é frequentemente feita nas entrevistas de Java, mas o entrevistador está apenas 50% satisfeito em responder a essa pergunta. Metade das pessoas não pode escrever um bloqueio de verificação dupla e metade das pessoas não pode dizer que seus perigos ocultos e como o Java 1.5 o corrigiu. Na verdade, é um método antigo criar singletons seguros para threads. Quando uma instância de singleton é criada pela primeira vez, ela tenta otimizar o desempenho com um único bloqueio, mas como é muito complexo, falha no JDK1.4, e eu pessoalmente também não gosto. De qualquer forma, mesmo que você não goste, ainda precisa entendê -lo porque é frequentemente solicitado. Você pode conferir como o bloqueio verificado duas vezes no artigo Singleton Works para obter mais informações.
49) Como criar um singleton seguro para tópicos em Java?
Este é um acompanhamento da pergunta acima. Se você não gosta de travas de verificação dupla e o entrevistador perguntou sobre um método alternativo para criar uma classe Singleton, você pode usar os recursos de carregamento da classe JVM e variáveis estáticas para criar uma instância singleton ou usar tipos de enumeração para criar um singleton. Eu gosto desse método. Você pode verificar este artigo para obter mais informações.
50) Escreva 3 melhores práticas multithreading que você segue
Eu gosto mais desse tipo de problema e acredito que você seguirá certas práticas recomendadas ao escrever código simultâneo para melhorar o desempenho. Aqui estão três melhores práticas que acho que a maioria dos programadores Java deve seguir:
Dê ao seu tópico um nome significativo.
Isso facilita encontrar bugs ou rastreá -los. OrderProcessor, Quotocessor ou TrustRocessor Este nome é muito melhor que o Thread-1. Thread-2 e Thread-3. Dê ao tópico um nome relacionado à tarefa que deseja concluir. Todas as principais estruturas e até JDKs seguem esta melhor prática.
Evite travar e estreitar o escopo da sincronização
Os bloqueios são caros e a troca de contexto é mais demorada. Tente usar a sincronização e os bloqueios para minimizar a área crítica. Por isso, prefiro os blocos de sincronização ao longo do método de sincronização, o que me dá controle absoluto sobre o bloqueio.
Use mais aulas de sincronização e use menos espera e notifique
Primeiro, as classes síncronas de CountdownLatch, Semaphore, CyclicBarrier e trocadores simplificam as operações de codificação, enquanto é difícil controlar fluxos de controle complexos com espera e notificar. Em segundo lugar, essas classes são escritas e mantidas pelas melhores empresas. Eles continuarão a ser otimizados e melhorados nos JDKs subsequentes. Usando essas ferramentas de sincronização de nível superior, seu programa pode ser otimizado sem nenhum esforço.
Use conjuntos mais simultâneos e conjuntos menos sincronizados. Esta é outra prática recomendada fácil de seguir. Os conjuntos simultâneos são mais escaláveis do que os conjuntos sincronizados; portanto, o uso de conjuntos simultâneos é melhor para programação simultânea. Se você precisar usar o mapa da próxima vez, primeiro pense em usar o ConcurrentHashMap. Meu artigo Java Colections tem uma descrição mais detalhada.
51) Como forçar a inicialização de um tópico?
Esse problema é como forçar a coleta de lixo Java. Ainda não há como fazer isso. Embora você possa usar o System.gc () para executar a coleta de lixo, não é garantido que seja bem -sucedido. Não há como forçar um thread a ser iniciado em Java, ele é controlado pelo agendador de threads e o Java não publica a API relevante.
52) Qual é a estrutura de junção do garfo em Java?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。