Tu es sûr de ne pas venir voir comment j'ai résolu mon problème d'atomicité?Questions d'entrevue Java haute concurrence et haute disponibilité

Android Martin Jr. 2021-08-19 21:42:49 阅读数:741

tu es ne pas venir
// Modifier la méthode non statique
synchronized void foo() {
// Zone critique
}
// Modifier la méthode statique
synchronized static void bar() {
// Zone critique
}
// Modifier le bloc de code
Object obj = new Object();
void baz() {
synchronized(obj) {
// Zone critique
}
}

}

Vous pourriez trouver ça un peu bizarre après avoir regardé,Ça ne correspond pas au modèle que nous avons mentionné plus haut,`Verrouillage lock()` Et`Déverrouiller unlock()` Où est - il??En fait, ces deux opérations existent,C'est juste que ces deux opérations ont été Java Silencieusement ajouté,Java Le compilateur sera synchronized La méthode de modification ou le bloc de code est automatiquement ajouté avant et après`Verrouillage lock()` Et`Déverrouiller unlock()`,L'avantage est que`Verrouillage lock()` Et`Déverrouiller unlock()` Ça doit être un couple,Après tout, j'ai oublié de déverrouiller `unlock()` Mais un mortel Bug(Cela signifie que les autres fils ne peuvent que mourir et attendre).
C'est... synchronized À l'intérieur.`Verrouillage lock()` Et`Déverrouiller unlock()` Où est l'objet verrouillé?Le code ci - dessus, quand on voit qu'il n'y a que des blocs de code modifiés, Verrouillé. obj Objet,Qu'est - ce qui s'est verrouillé pendant la modification?Celui - ci aussi Java Une règle implicite de :
> Lors de la modification des méthodes statiques , Verrouillé pour la classe courante Class Objet, Dans l'exemple ci - dessus, Class X;
Lorsque la méthode non statique est modifiée, L'objet d'instance courant est verrouillé this.
Pour l'exemple ci - dessus ,synchronized Modifier la méthode statique est équivalent à :
```java
class X {
// Modifier la méthode statique
synchronized(X.class) static void bar() {
// Zone critique
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

Modifier la méthode non statique,équivalent à:

class X {
// Modifier la méthode non statique
synchronized(this) void foo() {
// Zone critique
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Avec synchronized Résolution count+=1 Questions

Je suis sûr que vous vous souvenez de ce que nous avons mentionné dans l'article précédent count+=1 Problèmes de concurrence existants , Maintenant nous pouvons essayer synchronized Essaie un couteau. ,Les codes sont les suivants:.SafeCalc Cette classe a deux méthodes :L'un est get() Méthodes,Pour obtenir value Valeur de;L'autre est addOne() Méthodes, Pour donner value Plus 1,Et addOne() La méthode que nous utilisons synchronized Modification.Alors, y a - t - il un problème de concurrence entre les deux méthodes que nous utilisons?

class SafeCalc {
long value = 0L;
long get() {
return value;
}
synchronized void addOne() {
value += 1;
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Voyons d'abord addOne() Méthodes, D'abord, oui. ,Par synchronized Après modification, Qu'il s'agisse d'un seul noyau CPU Ou multicentrique CPU, Un seul thread peut exécuter addOne() Méthodes,Donc il doit être garanti que l'opération atomique, Y a - t - il un problème de visibilité? ?

Règles de verrouillage dans la tuyauterie : Déverrouiller une serrure Happens-Before Verrouillage ultérieur de cette serrure.

Pipeline , C'est nous. synchronized( Pour ce qui est du pipeline , Nous vous présenterons plus tard. ),Nous savons que synchronized Les zones critiques modifiées sont mutuellement exclusives ,C'est - à - dire qu'un seul thread exécute le Code de la zone critique en même temps; Et ce qu'on appelle “ Déverrouiller une serrure Happens-Before Verrouillage ultérieur de cette serrure ”,Indique que l'opération de déverrouillage du fil précédent est visible pour l'opération de verrouillage du fil suivant,Synthèse Happens-Before Principe de transmission ,Nous pouvons obtenir la variable partagée que le fil précédent a modifiée dans la zone critique( Avant de déverrouiller ), Pour l'entrée ultérieure dans la zone critique ( Cette opération est effectuée après verrouillage ) Les fils sont visibles .

Selon cette règle, Si plusieurs Threads exécutent simultanément addOne() Méthodes, La visibilité est garantie , Disons que si c'est le cas, 1000 Exécution du thread addOne() Méthodes, Le résultat final doit être value La valeur de 1000.Voir les résultats, Nous respirons , Le problème est enfin résolu. .

Mais peut - être , Tu l'as ignoré par inadvertance. get() Méthodes.Mise en œuvre addOne() Après la méthode,value Paire de valeurs pour get() La méthode est - elle visible? ?Cette visibilité n'est pas garantie. Règles de verrouillage dans la tuyauterie ,C'est seulement pour assurer la visibilité de cette serrure par la suite,Et get() Méthode non verrouillée , Donc la visibilité n'est pas garantie . Comment résoudre ça? ?C'est simple.,C'est get() La méthode synchronized Un instant.,Le code complet est le suivant.

class SafeCalc {
long value = 0L;
synchronized long get() {
return value;
}
synchronized void addOne() {
value += 1;
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Le code ci - dessus est converti en modèle de serrure que nous avons mentionné, C'est comme ça que ça se passe. .get() Méthodes et addOne() Toutes les méthodes doivent être accessibles value Cette ressource protégée , Cette ressource utilise this Cette serrure protège . Thread to enter Critical Area get() Et addOne(), Doit être obtenu en premier this Cette serrure. ,Voilà. get() Et addOne() C'est aussi mutuellement exclusif. .

 Protection des zones critiques get() Et addOne() Schéma de

Ce modèle ressemble davantage à la gestion des billets de match dans le monde réel,Un siège ne peut être utilisé que par une seule personne, Ce siège est “ Ressources protégées ”, L'entrée du terrain est Java Méthode dans la classe ,Et les billets servent à protéger les ressources“Verrouillage”,Java La vérification des billets est effectuée par synchronized Résolu .

Relation entre les serrures et les ressources protégées

Comme nous l'avons mentionné précédemment,La relation entre les ressources protégées et les serrures est très importante, Quelle est leur relation? ? Une relation raisonnable est :La relation entre la ressource protégée et la serrure est N:1 La relation entre. Et l'analogie avec la gestion des billets pour les matchs précédents, C'est un siège. ,On ne peut utiliser qu'un seul billet pour protéger, S'il y a des billets en double , Il va y avoir une bagarre. . Dans le monde réel ,Nous pouvons utiliser plusieurs serrures pour protéger la même ressource, Mais pas dans le domaine de la concurrence ,Les serrures du domaine de la concurrence ne correspondent pas exactement aux serrures du monde réel.Mais vous pouvez utiliser la même serrure pour protéger plusieurs ressources,Cette correspondance avec le monde réel est ce que nous appelons“ Baochang ”C'est.

SpringEnsemble complet de matériel pédagogique

Spring- Oui.JavaDu programmeur《Un livre de tournesol》,Tous les grands mouvements qu'il offre,Peut simplifier notre développement,Améliorer considérablement l'efficacité du développement!Pour l'instant99%La société a utiliséSpring,Vous pouvez visiter tous les sites Web de recrutement,SpringC'est un must - have,Alors assurez - vous de maîtriser.

Méthode de collecte des données: Cliquez ici pour accéder au portail bleu

Table des matières:

Contenu partiel:

SpringCode source

  • Première partie Spring Généralités
  • Deuxième partie L'idée centrale
  • Partie III Réalisation manuscrite IoC Et AOP(PersonnalisationSpringCadre)
  • Partie IV Spring IOC Applications avancées
    Caractéristiques de base
    Caractéristiques avancées
  • Partie V Spring IOCAnalyse approfondie du code source
    Design élégant
    Mode de conception
    Attention!:Principes、Méthodes et techniques
  • Partie VI Spring AOP Application
    Déclarer le contrôle des transactions
  • Partie VII Spring AOPAnalyse approfondie du code source
    Notes nécessaires、Les dessins nécessaires、Un langage facile à comprendre résout les difficultés du savoir

Cadre d'échafaudage:SpringBootTechnique

Son objectif est de simplifierSpringCréation d'applications et de services、Développement et déploiement,Profil simplifié,Utilisation d'un système intégréwebServeur,Contient de nombreuses fonctions de micro - service hors de la boîte,Oui.spring cloudDéploiement conjoint.

Spring BootL'idée centrale est que le contrat est plus grand que la configuration,L'application n'a besoin que de quelques configurations,Simplification du modèle de développement des applications.

  • SpringBootIntroduction
  • Profil
  • Log
  • WebDéveloppement
  • Docker
  • SpringBootAccès aux données
  • Principe de configuration de démarrage
  • Personnalisationstarter

Architecture des microservices:Spring Cloud Alibaba

Même chose. Spring Cloud C'est pareil,Spring Cloud Alibaba C'est aussi une solution de micro - service,.Contient les éléments nécessaires au développement de microservices d'applications distribuées,Pour faciliter le passage des développeurs Spring Cloud Les modèles de programmation utilisent facilement ces composantes pour développer des services d'application distribués.

  • Introduction à l'architecture des microservices
  • Spring Cloud AlibabaIntroduction
  • Mise en place d'un environnement de micro - services
  • Gouvernance des services
  • Tolérance aux pannes de service
  • Passerelle de service
  • Suivi des liens
  • ZipKinIntégration et persistance des données
  • Message Driven
  • Service de SMS
  • Nacos Confifig—Configuration du service
  • Seata—Transactions distribuées
  • Dubbo—rpcCommunications

Spring MVC

Table des matières:

Contenu partiel:

Copyright:Cet article est[Android Martin Jr.]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819214148442y.html