Prefácio
Existem opções de multiprocesso, multiencadeamento e multi-corrotina para programação simultânea. Para Java, não é como C ++, que chama APIs do sistema Linux para "bifurcar" vários processos durante a operação, nem fornece nativamente várias corrotinas no nível de linguagem como Go. Em Java, a simultaneidade é um modelo multithread.
Para a cognição do cérebro humano, o "código linha por linha" é certamente o mais fácil de entender. No entanto, no multithreading, o código de vários threads é cruzado e colocado em paralelo, e é necessário acessar recursos mutuamente exclusivos e comunicar-se entre si. Como desenvolvedor, você precisa projetar cuidadosamente a exclusão mútua e a sincronização entre os threads.Se você não for cuidadoso, você escreverá um código que não é seguro para threads. Por esse motivo, a programação multithread sempre foi um campo amplamente e profundamente discutido.
Antes do lançamento do JDK 1.5, o Java fornecia apenas alguns mecanismos simples de exclusão mútua de thread e sincronização no nível da linguagem, ou seja, a palavra-chave synchronized, wait and notifique. Se você encontrar cenários complexos de programação multithread, os desenvolvedores precisam resolver problemas complexos de sincronização de thread com base nesses mecanismos simples. Desde o JDK 1.5, o mestre de programação simultânea Doug Lea oferece uma estrutura de programação simultânea sistemática e abrangente - o pacote JDK Concurrent, que contém várias operações atômicas, containers thread-safe, thread pools e programação assíncrona.
Com base no JDK 7 e no JDK 8, este artigo conduz uma análise abrangente do código-fonte de todo o pacote Simultâneo. A implementação da maioria das funções de simultaneidade no JDK 8 é a mesma do JDK 7, mas alguns recursos adicionais foram adicionados. Por exemplo, CompletableFuture, nova implementação de ConcurrentHashMap, StampedLock, LongAdder, etc.
A análise do código-fonte de todo o pacote Simultâneo tem as seguintes finalidades:
- (1) Ajude os usuários a escolher soluções de maneira razoável. O pacote Simultâneo é enorme, com vários mecanismos de exclusão e sincronização de thread. Entenda o princípio de implementação, os usuários podem escolher a solução mais adequada de acordo com seus próprios cenários de negócios. Evite recriar as rodas e evite cair no "poço" devido ao uso impróprio.
- (2) A análise do código-fonte permitirá que os usuários compreendam os princípios básicos das barreiras de memória, operações atômicas CAS, bloqueios e desbloqueio, e não mais permanecerão em um estágio "paradoxal", mas compreenderão profundamente sua essência.
- (3) Absorva o pensamento dos mestres. No pacote Simultâneo, você pode ver várias estratégias inteligentes de processamento simultâneo. Olhando para o pacote Simultâneo, você descobrirá que no multithreading, não existem apenas bloqueios mutex simples, mecanismos de notificação e pools de threads.
Este artigo começará com os fundamentos de multi-threading e, gradualmente, mergulhará em todo o pacote Simultâneo. Depois de ler este livro, você terá uma compreensão abrangente e profunda dos princípios de multithreading e vários princípios de design simultâneo.
Capítulo 1 Noções básicas de multithreading
- 1.1 Desligamento normal de threads
- 1.2 Função InterruptedException () e função interrupt ()
- 1.3 palavra-chave sincronizada
- 1,4 esperar () 与 notificar ()
- 1,5 palavra-chave volátil
- 1.6 JMM 与 acontecer antes
- 1.7 barreira de memória
- 1.8 palavra-chave final
- 1.9 Aplicação abrangente: programação sem bloqueio
Capítulo 2 Classe Atômica
A partir deste capítulo, analisaremos a hierarquia de todo o pacote Simultâneo passo a passo, do simples ao complexo, de baixo para cima, conforme mostrado na figura:
- 2.1 AtomicInteger 和 AtomicLong
- 2.2 AtomicBoolean 和 AtomicReference
- 2.3 AtomicStampedReference 和 AtomicMarkableReference
- 2.4 AtomicIntegerFieldUpdater 、 AtomicLongFieldUpdater 和 AtomicReferenceFieldUpdater
- 2.5 AtomicIntegerArray 、 AtomicLongArray 和 Atomic-ReferenceArray
- 2.6 Striped64 e LongAdder
Capítulo 3 Bloqueio e condição
- 3.1 Mutex
- 3.2 Bloqueio de leitura e gravação
- 3.3 Condição
- 3.4 StampedLock
Capítulo 4 Ferramentas de sincronização
Além de bloqueios e condições, o pacote Simultâneo também fornece uma série de ferramentas de sincronização. Alguns dos princípios dessas ferramentas de sincronização são baseados em AQS e alguns requerem mecanismos de implementação especiais.Este capítulo analisará os princípios de implementação de todas as ferramentas de sincronização.
- 4.1 Semáforo
- 4.2 CountDownLatch
- 4.3 CyclicBarrier
- 4.4 Trocador
- 4.5 Phaser
Capítulo 5 Recipientes simultâneos
Na implementação do Lock e do Phaser, uma fila sem bloqueio e uma pilha sem bloqueio baseada em CAS foram introduzidas. Este capítulo irá apresentar de forma abrangente os vários contêineres simultâneos fornecidos pelo pacote Simultâneo.
- 5.1 BlockingQueue
- 5.2 BlockingDeque
- 5.3 CopyOnWrite
- 5.4 ConcurrentLinkedQueue/Deque
- 5.5 ConcurrentHashMap
- 5.6 ConcurrentSkipListMap / Set
Capítulo 6 Grupo de Threads e Futuro
- 6.1 O princípio de realização do pool de threads
- 6.2 Sistema de herança de classe do pool de threads
- 6.3 ThreadPoolExector
- 6.4 Callable 与 Future
- 6.5 ScheduledThreadPoolExecutor
- 6.6 Ferramentas de executores
Capítulo 7 ForkJoinPool
- 7.1 Uso da ForkJoinPool
- 7.2 Estrutura de dados principais
- 7.3 Fila de roubo de trabalho
- 7.4 Controle de status ForkJoinPool
- 7.5 Bloqueio do mecanismo de ativação do thread de trabalho
- 7.6 Análise do processo de envio de tarefas
- 7.7 Algoritmo de roubo de trabalho: análise do processo de execução da tarefa
- 7.8 ForkJoinTask 的 fork / join
- 7.9 Fechamento elegante de ForkJoinPool
Capítulo 8 CompletableFuture
A partir do JDK 8, CompletableFuture, uma poderosa ferramenta de programação assíncrona, é fornecida no pacote Simultâneo. Antes do JDK8, a programação assíncrona pode ser alcançada por meio do pool de threads e do Future, mas a função não é poderosa o suficiente. O surgimento de CompletableFuture levou os recursos de programação assíncrona do Java um grande passo à frente. Antes de discutir o princípio de CompletableFuture, vamos dar uma olhada detalhada no uso de CompletableFuture. A partir desses usos, podemos ver quais recursos foram aprimorados em comparação com o Future anterior.
- 8.1 Uso CompletableFuture
- 8.2 Quatro protótipos de missão
- 8.3 Interface CompletionStage
- 8.4 Princípio Interno do Futuro Completável
- 8.5 Execução de tarefas em malha: gráfico acíclico direcionado
- 8.6 Análise do gráfico de cálculo dentro de allOf
Devido ao tamanho do artigo, o documento completo não pode ser carregado, apenas parte dele pode ser carregado aqui. Amigos em necessidade podem me adicionar: "VX Assistant" para obtê-lo gratuitamente.