La première partie du dossier d'apprentissage du combat de programmation simultanée Java

Insérez la description de l'image ici

01 | Visibilité, atomicité et classement: la source de bogues de programmation simultanés

L'histoire derrière le programme simultané

Insérez la description de l'image ici

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

Insérez la description de l'image ici

La troisième source: le problème de commande apporté par l'optimisation de la compilation

Insérez la description de l'image ici

Résumé

Insérez la description de l'image ici

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?

Insérez la description de l'image ici

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

  1. 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.

  2. 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.

  3. Transitivité
    Cette règle signifie que si A se produit avant B et B se produit avant C, alors A se produit avant C.

  4. 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.

  5. 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.

  6. 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

Insérez la description de l'image ici

  1. Détruire les conditions d'occupation et d'attente
  2. Destruction des conditions non préemptives
  3. 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.
Insérez la description de l'image ici

Résumé

Résumé

08 | Gouvernance: la clé principale de la programmation simultanée

Qu'est-ce que le contrôle

Insérez la description de l'image ici

Modèle MESA

Insérez la description de l'image ici
Insérez la description de l'image ici

La bonne posture d'attente ()

notifier () quand peut-il être utilisé

Résumé

Insérez la description de l'image ici

09 | Java Thread (Partie 1): Cycle de vie du thread Java

Cycle de vie du fil conducteur

Insérez la description de l'image ici

Cycle de vie des threads en Java

Insérez la description de l'image ici

  1. 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é

  2. 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.

  3. Transition d'état RUNNABLE et TIMED_WAITING
    Insérez la description de l'image ici

  4. De l'état NEW à RUNNABLE, appelez la méthode start () de l'objet thread

  5. 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

Insérez la description de l'image ici

13 | Réponses aux questions brûlantes des modules de base théoriques

Et cette "histoire sérielle"?

Insérez la description de l'image ici
Insérez la description de l'image ici

1. Meilleures pratiques d'utilisation des verrous

2. Les performances de la serrure dépendent de la scène

3. La condition de course nécessite une attention particulière

4. L'appel de méthode consiste à calculer d'abord les paramètres

5. La gestion des exceptions InterruptedException doit être prudente

6. Valeur théorique ou valeur empirique

Publié 138 articles originaux · loué 3 · visites 7212

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43719015/article/details/105665924
conseillé
Classement