Maison Java javaDidacticiel Exemple de Java implémentant une programmation sans verrouillage d'instructions cas

Exemple de Java implémentant une programmation sans verrouillage d'instructions cas

Sep 15, 2017 am 11:07 AM
java 实例 编程

Cet article présente principalement l'exemple d'implémentation de programmation sans verrouillage de l'instruction cas en langage Java. Il a une certaine valeur de référence et les amis dans le besoin peuvent en apprendre davantage.

La première fois que vous entrez en contact avec un contenu pertinent, c'est avec le mot-clé volatile. Vous savez qu'il peut assurer la visibilité des variables, et qu'il peut être utilisé pour implémenter des opérations atomiques de lecture et d'écriture. . . Mais volatile ne peut rien faire pour implémenter certaines opérations composites. . . Les représentants les plus typiques sont les opérations d'incrémentation et de décrémentation. . . .

Nous savons que dans un environnement concurrent, le moyen le plus simple d'assurer la cohérence des données est de verrouiller pour garantir qu'un seul thread peut opérer sur les données en même temps. . . . Par exemple, un compteur peut être implémenté de la manière suivante :


public class Counter {
  private volatile int a = 0;
  public synchronized int incrAndGet(int number) {
    this.a += number;
    return a;
  } 
  public synchronized int get() {
    return a;
  }
}
Copier après la connexion

On modifie toutes les opérations avec le mot-clé synchronisé pour assurer un accès synchrone à l'attribut a. . . Cela peut en effet garantir la cohérence d'un dans un environnement concurrent, mais en raison de l'utilisation de verrous, de la surcharge de verrouillage, de la planification des threads, etc., l'évolutivité du programme est limitée, il existe donc de nombreuses implémentations sans verrouillage. . . .

En fait, ces méthodes sans verrouillage utilisent toutes certaines instructions CAS (comparer et changer) fournies par le processeur. Que fait ce CAS ? Vous pouvez utiliser la méthode suivante pour expliquer ce que fait le CAS. La sémantique représentée :


public synchronized int compareAndSwap(int expect, int newValue) {
    int old = this.a;
    if (old == expect) {
      this.a = newValue;
    }
    return old;
  }
Copier après la connexion

Eh bien, l'offre pour la sémantique CAS devrait être très claire à travers le code. Il semble que la plupart des processeurs implémentent désormais la commande CAS atomique. .
D'accord, voyons où CAS est utilisé en Java. Examinons d'abord le type AtomicInteger. Il s'agit d'un type fourni par la bibliothèque de concurrence :


<🎜. >
private volatile int value;
Copier après la connexion
Il s'agit d'un attribut défini en interne, utilisé pour sauvegarder les valeurs. Puisqu'il est de type volatile, il peut assurer la visibilité entre les threads et l'atomicité de lecture et d'écriture. . .

Jetons ensuite un coup d'œil à quelques-unes des méthodes les plus couramment utilisées :


public final int addAndGet(int delta) {
  for (;;) {
    int current = get();
    int next = current + delta;
    if (compareAndSet(current, next))
      return next;
  }
}
Copier après la connexion
La fonction de cette méthode est d'ajouter un delta à la valeur actuelle, ici Vous pouvez voir qu'il n'y a pas de verrou dans l'ensemble de la méthode. Ce code est en fait une méthode pour implémenter un compteur sans verrouillage en Java. La méthode compareAndSet est définie comme suit :


<. 🎜>

Puisque la méthode non sécurisée est appelée, vous ne pouvez rien y faire. En fait, vous devriez pouvoir deviner que la JVM appelle l'instruction CAS du processeur lui-même pour implémenter des opérations atomiques. . .
public final boolean compareAndSet(int expect, int update) {
  return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Copier après la connexion


Fondamentalement, les méthodes importantes de type AtomicInteger sont implémentées sans verrouillage. . Par conséquent, dans un environnement concurrent, l’utilisation de ce type peut offrir de meilleures performances. . .

Ce qui précède a été complété pour implémenter un compteur sans verrouillage en Java. Voyons ensuite comment implémenter une pile sans verrouillage et collez le code directement. Le code est imité de "JAVA Concurrent Programming in Action". " :



D'accord, le code ci-dessus implémente une pile sans verrouillage, simple. . . Dans un environnement concurrent, les structures de données sans verrouillage peuvent bien mieux évoluer que les verrous. . .
package concurrenttest;
import java.util.concurrent.atomic.AtomicReference;
public class ConcurrentStack<e> {
  AtomicReference<node<e>> top = new AtomicReference<node<e>>();
  public void push(E item) {
    Node<e> newHead = new Node<e>(item);
    Node<e> oldHead;
    while (true) {
      oldHead = top.get();
      newHead.next = oldHead;
      if (top.compareAndSet(oldHead, newHead)) {
        return;
      }
    }
  }
  public E pop() {
    while (true) {
      Node<e> oldHead = top.get();
      if (oldHead == null) {
        return null;
      }
      Node<e> newHead = oldHead.next;
      if (top.compareAndSet(oldHead, newHead)) {
        return oldHead.item;
      }
    }
  }
  private static class Node<e> {
    public final E item;
    public Node<e> next;
     
    public Node(E item) {
      this.item = item;
    }
  }
}
Copier après la connexion
Quand on parle de programmation sans verrouillage, nous devons mentionner les files d'attente sans verrouillage. En fait, l'implémentation de files d'attente sans verrouillage a été fournie dans la bibliothèque concurrente : ConcurrentLinkedQueue.



Cette méthode est utilisée pour ajouter des éléments à la fin de la file d'attente. Ici, vous pouvez voir qu'il n'y a pas de verrou pour l'algorithme sans verrouillage spécifique, Michael-Scott l'a proposé. Un algorithme de liste chaînée non bloquant. . . Pour voir comment cela fonctionne spécifiquement, vous pouvez consulter « Programmation simultanée JAVA en pratique » pour une introduction plus détaillée.
public boolean offer(E e) {
  checkNotNull(e);
  final Node<e> newNode = new Node<e>(e);
  for (Node<e> t = tail, p = t;;) {
    Node<e> q = p.next;
    if (q == null) {
      // p is last node
      if (p.casNext(null, newNode)) {
        // Successful CAS is the linearization point
        // for e to become an element of this queue,
        // and for newNode to become "live".
        if (p != t) // hop two nodes at a time
          casTail(t, newNode); // Failure is OK.
        return true;
      }
      // Lost CAS race to another thread; re-read next
    }
    else if (p == q)
      // We have fallen off list. If tail is unchanged, it
      // will also be off-list, in which case we need to
      // jump to head, from which all live nodes are always
      // reachable. Else the new tail is a better bet.
      p = (t != (t = tail)) ? t : head;
    else
      // Check for tail updates after two hops.
      p = (p != t && t != (t = tail)) ? t : q;
  }
}
Copier après la connexion

De plus, d'autres méthodes sont effectivement mises en œuvre de manière sans verrouillage.

Enfin, dans la programmation réelle, il est préférable d'utiliser ces implémentations sans verrouillage dans un environnement concurrent, après tout, elles ont une meilleure évolutivité.

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

La clé du codage : libérer la puissance de Python pour les débutants La clé du codage : libérer la puissance de Python pour les débutants Oct 11, 2024 pm 12:17 PM

Python est un langage d'introduction à la programmation idéal pour les débutants grâce à sa facilité d'apprentissage et ses fonctionnalités puissantes. Ses bases incluent : Variables : utilisées pour stocker des données (nombres, chaînes, listes, etc.). Type de données : Définit le type de données dans la variable (entier, virgule flottante, etc.). Opérateurs : utilisés pour les opérations mathématiques et les comparaisons. Flux de contrôle : contrôlez le flux d'exécution du code (instructions conditionnelles, boucles).

Libérez votre programmeur intérieur : C pour les débutants absolus Libérez votre programmeur intérieur : C pour les débutants absolus Oct 11, 2024 pm 03:50 PM

C est un langage idéal pour les débutants qui souhaitent apprendre la programmation, et ses avantages incluent l'efficacité, la polyvalence et la portabilité. L'apprentissage du langage C nécessite : Installer un compilateur C (tel que MinGW ou Cygwin) Comprendre les variables, les types de données, les instructions conditionnelles et les instructions de boucle Ecrire le premier programme contenant la fonction principale et la fonction printf() S'entraîner à travers des cas pratiques (comme le calcul de moyennes) Connaissance du langage C

Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Oct 11, 2024 pm 10:47 PM

C est un choix idéal pour les débutants qui souhaitent apprendre la programmation système. Il contient les composants suivants : fichiers d'en-tête, fonctions et fonctions principales. Un simple programme C capable d'imprimer "HelloWorld" a besoin d'un fichier d'en-tête contenant la déclaration de fonction d'entrée/sortie standard et utilise la fonction printf dans la fonction principale pour imprimer. Les programmes C peuvent être compilés et exécutés à l'aide du compilateur GCC. Après avoir maîtrisé les bases, vous pouvez passer à des sujets tels que les types de données, les fonctions, les tableaux et la gestion des fichiers pour devenir un programmeur C compétent.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles