01 | Visibilité, atomicité et classement: la source de bogues de programmation simultanés
L'histoire derrière le programme simultané
L'une des sources: problèmes de visibilité causés par la mise en cache
La deuxième source: le problème atomique causé par le changement de thread
La troisième source: le problème de commande apporté par l'optimisation de la compilation
Résumé
02 | Modèle de mémoire Java: découvrez comment Java résout les problèmes de visibilité et d'ordre
Qu'est-ce que le modèle de mémoire Java?
Confusion sur l'utilisation de produits volatils
Règle Happens-Before
Le résultat de l'opération précédente est visible pour les opérations suivantes
-
La règle de séquence du programme
Cette règle se réfère à l'opération précédente Happens-Before dans n'importe quel thread conformément à la séquence du programme dans un thread. -
Règle de variable volatile
Cette règle fait référence à l'opération d'écriture d'une variable volatile, Happens-Before dans l'opération de lecture suivante de cette variable volatile. -
Transitivité
Cette règle signifie que si A se produit avant B et B se produit avant C, alors A se produit avant C. -
La règle de verrouillage dans le processus de canalisation
Cette règle fait référence au déverrouillage d'une serrure qui se produit avant et au verrouillage ultérieur de cette serrure. -
Règle de démarrage du thread ()
Il s'agit du démarrage du thread. Cela signifie qu'après que le thread principal A démarre le thread enfant B, le thread enfant B peut voir le fonctionnement du thread principal avant de démarrer le thread enfant B. -
Thread join () rule
Il s'agit de thread en attente. Cela signifie que le thread principal A attend la fin du sous-thread B (le thread principal A est réalisé en appelant la méthode join () du sous-thread B), et lorsque le sous-thread B se termine (la méthode join () du thread principal A revient), le thread principal peut voir Au fil enfant. Bien sûr, le soi-disant "voir" se réfère au fonctionnement des variables partagées.
Résumé
En langage Java,La sémantique de Happens-Before est essentiellement une sorte de visibilité, A Happens-Before B signifie que l'événement A est visible par l'événement B, que l'événement A et l'événement B se produisent dans le même thread. Par exemple, l'événement A se produit sur le thread 1 et l'événement B se produit sur le thread 2. La règle Happens-Before garantit que le thread 2 peut également voir l'occurrence de l'événement A.
03 | Verrouillage d'exclusion mutuelle (partie 1): résolution des problèmes atomiques
Comment résoudre le problème atomique?
Vous savez déjà que la source du problème d'atomicité est
que la condition de commutation de thread "un seul thread s'exécute en même temps" est très importante, ce que nous appelons l'exclusion mutuelle.
Modèle de verrouillage simple
Modèle de verrouillage amélioré
Technologie de verrouillage fournie par le langage Java: synchronisée
04 | Verrouillage d'exclusion mutuelle (Partie 2): Comment protéger plusieurs ressources avec un seul verrou?
Protégez plusieurs ressources qui ne sont pas liées
Protéger plusieurs ressources liées
Résumé
Quelle est l'essence de "l'atomicité"? En fait, il n'est pas indivisible, indivisible n'est qu'une manifestation externe, son essence est l'exigence de cohérence entre plusieurs ressources,L'état intermédiaire de l'opération n'est pas visible pour le monde extérieur.
05 | Que faire si je bloque accidentellement?
Comment éviter l'impasse
- Détruire les conditions d'occupation et d'attente
- Destruction des conditions non préemptives
- Briser la condition d'attente de boucle
06 | Attente circulaire optimisée avec mécanisme "wait-notify"
Implémentation du mécanisme de notification d'attente avec synchronisation
07 | Problèmes de sécurité, d'activité et de performances
Est-ce que tout le code doit être soigneusement analysé si ces trois problèmes existent? Bien sûr que non. En fait, une seule situation est nécessaire: il y a des données partagées et les données vont changer. En règle générale, plusieurs threads liront et écriront les mêmes données en même temps.
Programmation simultanéeIl y a de nombreux problèmes auxquels nous devons prêter attention. Heureusement, nos prédécesseurs nous ont aidés à les résumer. Il y a trois aspects principaux, à savoir: les problèmes de sécurité, les problèmes actifs et les problèmes de performances.
Problèmes de sécurité
Lorsque plusieurs threads accèdent aux mêmes données en même temps et qu'au moins un thread écrit ces données, si nous ne prenons pas de mesures de protection, cela entraîne des bogues simultanés. Il existe également un terme professionnel pour cela, appelé Data Race )
La condition de concurrence fait référence à l'ordre dans lequel le résultat de l'exécution du programme dépend de l'exécution du thread.
Face à la concurrence des données et aux conditions de course , comment assurer la sécurité des threads? En fait, les deux types de problèmes peuvent utiliser la solution de technologie d'exclusion mutuelle, et il existe de nombreuses solutions pour parvenir à l'exclusion mutuelle. Le processeur fournit des instructions mutuellement exclusives et le système d'exploitation et le langage de programmation fournissent également des API associées. D'un point de vue logique, nous pouvons être unifiés en: lock .
Problème actif
Le problème dit de la vivacité fait référence au fait qu'une opération ne peut pas être effectuée. Notre "impasse" commune est un problème actif typique, bien sûr, en plus de l' impasse , il y a deux cas, à savoir " livelock " et "faim" .
Parfois, bien que le thread ne soit pas bloqué, il y aura toujours des situations où il ne pourra pas être exécuté.
Le soi-disant «faim» fait référence à la situation que le thread ne peut pas exécuter car il ne peut pas accéder aux ressources requises.
Problèmes de performances
La raison pour laquelle il y a tant de choses dans le package simultané Java SDK est qu'une grande partie de la raison est d'améliorer les performances dans un domaine spécifique.
Résumé
08 | Gouvernance: la clé principale de la programmation simultanée
Qu'est-ce que le contrôle
Modèle MESA
La bonne posture d'attente ()
notifier () quand peut-il être utilisé
Résumé
09 | Java Thread (Partie 1): Cycle de vie du thread Java
Cycle de vie du fil conducteur
Cycle de vie des threads en Java
-
Transition d'état RUNNABLE et BLOCKED
Il n'y a qu'un seul scénario qui déclenchera cette transition, c'est-à-dire que le thread attend un verrouillage implicite synchronisé -
Transition d'état de RUNNABLE et WAITING Le
premier scénario consiste à obtenir un thread de verrouillage implicite synchronisé et à appeler la méthode Object.wait () sans paramètre.
Le second scénario consiste à appeler la méthode Thread.join () sans paramètre.
Dans le troisième scénario, appelez la méthode LockSupport.park (). Appelez la méthode LockSupport.park (), le thread actuel se bloquera et l'état du thread passera de RUNNABLE à WAITING. Appelez LockSupport.unpark (Thread thread) pour réveiller le thread cible, et l'état du thread cible passera de l'état WAITING à RUNNABLE. -
Transition d'état RUNNABLE et TIMED_WAITING
-
De l'état NEW à RUNNABLE, appelez la méthode start () de l'objet thread
-
De l'état RUNNABLE à TERMINATED
Quelle est la principale différence entre les méthodes stop () et interrupt ()?
10 | Fils Java (milieu): combien de fils convient-il de créer?
Pourquoi utiliser le multithreading?
Il existe de nombreux indicateurs pour mesurer les performances, mais il y a deux indicateurs au cœur, qui sont la latence et le débit .
Scénarios d'application multithread
Combien de threads sont appropriés pour créer?
Les scénarios de calcul intensifs en CPU, en théorie, "le nombre de threads = le nombre de cœurs de CPU" sont les plus appropriés. Cependant, en ingénierie, le nombre de threads est généralement défini sur "CPU cores + 1"
Pour les scénarios de calcul intensifs en E / S, le nombre optimal de threads = nombre de cœurs de processeur * [1 + (E / S chronophage / CPU)]
En fait, tant que vous comprenez un principe, ce principe est de maximiser les performances du matériel.
11 | Threads Java (Partie 2): Pourquoi les variables locales sont-elles thread-safe?
Comment la méthode est exécutée
Où sont stockées les variables locales?
Pile d'appels et thread
Fermeture de fil
12 | Comment écrire des programmes simultanés avec une pensée orientée objet?
Tout d'abord, encapsulez les variables partagées
Pour ces variables partagées qui ne changeront pas, il est recommandé d'utiliser le mot clé final pour modifier
Deuxièmement, identifier les contraintes entre les variables partagées
3. Développer des stratégies d'accès simultanées
13 | Réponses aux questions brûlantes des modules de base théoriques
Et cette "histoire sérielle"?