Galleria mappe mentale Concorrenza Java
Questa è una mappa mentale sulla concorrenza Java. Il contenuto principale include: blocchi, pool di thread, contenitori simultanei e concetti di base.
Modificato alle 2024-04-22 19:41:17Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Concorrenza Java
concetto di base
processi
mucchio
zona metodo
L'heap e l'area dei metodi sono risorse condivise da tutti i thread. L'heap è la parte di memoria più grande nel processo e viene utilizzata principalmente per archiviare gli oggetti appena creati (quasi tutti gli oggetti allocano qui la memoria). oggetti. Informazioni sulla classe, costanti, variabili statiche, codice compilato dal compilatore just-in-time e altri dati.
filo
contatore di programma
Stack di macchine virtuali
stack di metodi nativi
Possono esserci più thread in un processo e più thread condividono le risorse dell'heap e dell'area del metodo (metaspazio dopo JDK1.8) del processo, ma ogni thread ha il proprio contatore di programma, stack della macchina virtuale e stack del metodo locale.
concorrente
parallelo
Può facilmente portare a perdite di memoria, deadlock e insicurezza dei thread
Sincronizzare
asincrono
Sicurezza del filo
Crea discussione
Ciclo di vita e stato del thread
NUOVO
Pronto (eseguibile)
Corsa
Bloccato
Blocco sincrono (Bloccato)
In attesa del blocco (WAITING)
Blocco attesa timeout (TMME-WAITING)
Morte (Morto/TERMINATO)
Cambio del contesto del thread
blocco del thread
Quattro condizioni necessarie per lo stallo
Come prevenire lo stallo
Come risolvere i problemi
Grafica: jconsole
jps -l scopre il numero del processo del programma, il numero del processo jstack
JMM
definizione
sfondo
Coerenza della CPU e della cache
Ottimizzazione del processore
Riordino parallelo delle istruzioni
Riorganizzazione dell'ottimizzazione del compilatore
Riorganizzazione del sistema di memoria
Teoria della concorrenza
regole come se fossero seriali
accade prima della regola
regole di sequenza del programma
Monitorare le regole di blocco
Regole delle variabili volatili
regola di transitività
regola start()
regole join()
Tre caratteristiche principali
atomicita
visibilità
Ordine
Come risolvere i problemi di concorrenza
Tre parole chiave principali
volatile
visibilità
avviene prima del principio
principio
scrivere la semantica della memoria
Leggere la semantica della memoria
Ordine
Implementazione della semantica della memoria
sincronizzato
effetto
atomicita
Ordine
visibilità
scrivere la semantica della memoria
Leggere la semantica della memoria
Utilizzo
Decora metodi di istanza
Modificare metodi statici
Decora blocchi di codice
principio
blocco di codice sincronizzato
metodo di sincronizzazione
modello a oggetti Java
Intestazione dell'oggetto
Segna Parola
Punto Klass
Dati dell'istanza
Allineamento dei byte
aggiornamento del blocco
nessuna serratura
Stato di blocco
blocco del pregiudizio
Stato di blocco
Tempo di aggiornamento
Operazioni specifiche
beneficio
L'ID del thread distorto non è coerente con l'ID del thread corrente.
Successo della competizione
La concorrenza è fallita
Realizzazione tecnica
serratura leggera
Stato di blocco
Tempo di aggiornamento
effetto
Rotazione
La differenza tra bias lock e bias lock
Serratura pesante
Stato di blocco
Tempo di aggiornamento
principio
Ottimizzazione jdk1.6
blocco della rotazione
blocco rotazione adattivo
eliminazione del blocco
irruvidimento della serratura
blocco del pregiudizio
serratura leggera
finale
effetto
Regole di riordino
Scrivi le regole di riordino per i campi finali
Regole di riordino per la lettura dei campi finali
barriera della memoria
contenitore simultaneo
Elenco
CopyOnWriteArrayList
Vettore
Impostato
CopyOnWriteArraySet
Carta geografica
ConcurrentHashMap
ConcurrentSkipListMap
HashTable
coda
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
Coda sincrona
Gruppo di discussioni
definizione
Vantaggio
Ridurre il consumo di risorse
Migliora la velocità di risposta
Migliora la gestibilità dei thread
Come creare
Esecutori
Pool di thread fissi
Esecutore SingleThread
Probabilmente viene utilizzata una LinkedBlockingQueue illimitata. La lunghezza massima della coda delle attività è Integer.MAX_VALUE. Potrebbe accumularsi un numero elevato di richieste, con conseguente OOM.
Pool di thread memorizzati nella cache
Viene utilizzata la coda di sincronizzazione SynchronousQueue e il numero di thread che è possibile creare è Integer.MAX_VALUE.
Pool di thread pianificati
Viene utilizzata la coda di blocco ritardato illimitato DelayedWorkQueue. La lunghezza massima della coda delle attività è Integer.MAX_VALUE, che può accumulare un numero elevato di richieste, con conseguente OOM.
ThreadPoolExecutor
Parametri comuni
corePoolSize
dimensione massima della piscina
workQueue
keepAliveTime
unità
threadFactory
gestore
AbortPolicy
CallerRunsPolicy
Politica di eliminazione
Elimina politica più vecchia
Processo di gestione delle attività
Come impostare la dimensione del pool di thread
Algoritmo teorico
metodo empirico
Attività ad uso intensivo della CPU (N 1)
Attività ad uso intensivo di I/O (2N)
Classe futura
Annulla attività
Determina se l'attività è stata annullata
Determina se l'attività è stata completata
Ottieni i risultati dell'esecuzione delle attività
discordanza
CompletabileFuturo
Risolvere le carenze del futuro
vantaggio
Fase di completamento
Serratura
concetto di base
blocco pessimistico
vantaggio
Il costo del blocco pessimistico è fisso
discordanza
La feroce competizione tra lock può causare il blocco del thread
Un gran numero di thread bloccati causerà il cambio di contesto del sistema Aumentare il sovraccarico delle prestazioni del sistema
Il blocco pessimistico può anche causare problemi di deadlock
Scena applicabile
Scrivi scenari multipli e una concorrenza accanita (per evitare frequenti fallimenti e tentativi che influiscono sulle prestazioni)
chiusura ottimistica
vantaggio
Non esiste alcuna competizione di blocco che causi il blocco del thread
Non ci sarà alcun problema di stallo
discordanza
Se i conflitti si verificano frequentemente (si verificano molte scritture), si verificheranno frequenti errori e tentativi.
Scena applicabile
Scenari di lettura multipli, meno concorrenza (può evitare blocchi frequenti che influiscono sulle prestazioni)
Piano di attuazione
Meccanismo del numero di versione
Algoritmo CAS
Domande dell'ABA
Tempo di ciclo lungo e costi generali elevati
Sono garantite solo le operazioni atomiche su una variabile condivisa
ThreadLocal
effetto
principio
Algoritmo hash
Conflitto di hash
Problema di perdita di memoria
motivo
soluzione
AQS
idea principale
stato
Coda CLH
struttura
principio
vantaggio
Prestazioni eccellenti, costi generali ridotti per l'acquisizione e il rilascio dei lock.
serratura giusta
Semplice da implementare e di facile comprensione
Forte scalabilità
discordanza
L'operazione di rotazione causerà un notevole sovraccarico della CPU quando il blocco viene mantenuto per un lungo periodo.
Funzione singola e non può supportare funzioni complesse
Varianti della coorte CLH
AQS modifica l'operazione di rotazione in un'operazione di blocco del thread
Miglioramenti per bloccare le strutture dati
Estendi lo stato di ciascun nodo
SEGNALE
PROPAGARE
CONDIZIONE
ANNULLATO
Mantieni esplicitamente i nodi predecessore e successore
Ottimizzazione del GC ausiliario come l'impostazione esplicita del nodo di rimozione dalla coda su null
Diagramma schematico
serratura condivisa
serratura esclusiva
ReentrantLock
cosa è
principio
Processo di blocco ingiusto
Quando il thread uno è bloccato correttamente
Dati interni dell'AQS
Blocco del thread due non riuscito
Situazione coda CLH
Blocco del thread tre non riuscito
Processo di blocco del fair lock
Processo di sblocco
Il processo di rilascio del blocco
In attesa dei dati della coda
dati della coda finale
Condizione
Principio di attuazione
RientranteReadWriteLock
Scena applicabile
Un thread che detiene un blocco di lettura può comunque acquisire un blocco di scrittura?
Il blocco di lettura non può essere aggiornato al blocco di scrittura
Semaforo
Due modalità
modalità fiera
Modello ingiusto
principio
Conteggio alla rovescia
effetto
principio
Monouso
Barriera ciclica
Classe atomica
tipo base
AtomicInteger
AtomicLong
AtomicBoolean
tipo di matrice
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
tipo di riferimento
Riferimento atomico
AtomicStampedReference
Tipo di modifica della proprietà dell'oggetto
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater