Maison Java javaDidacticiel Cours dans les collections Java sur la sécurité des threads

Cours dans les collections Java sur la sécurité des threads

Jan 23, 2017 pm 04:42 PM

Classes Thread-safe dans les collections Java

Classes Thread-safe

Dans le framework de collection, certaines classes sont thread-safe, elles sont toutes apparues dans jdk1.1. Après jdk1.2, de nombreuses classes non thread-safe sont apparues. Voici ces classes de synchronisation thread-safe :

vecteur : Il possède un mécanisme de synchronisation de plus (sécurité des threads) que arraylist. En raison de sa faible efficacité, son utilisation n'est plus recommandée. Dans les applications Web, en particulier les pages frontales, l'efficacité (vitesse de réponse des pages) est souvent une priorité.

statck : classe de pile, premier entré, dernier sorti

hashtable : plus thread-safe que hashmap

énumération : énumération, équivalente à l'itérateur

Sauf ceux-ci, tout le reste est constitué de classes et d'interfaces non thread-safe.

Les méthodes des classes thread-safe sont synchronisées et ne sont accessibles qu'une à la fois. C’est un objet lourd et peu efficace.

Autres :

1. La différence entre hashtable et hashmap

hashtable est thread-safe, c'est-à-dire que les méthodes hashtable fournissent un mécanisme de synchronisation qui n'est pas thread-safe ; , c'est-à-dire qu'aucun mécanisme de synchronisation n'est fourni ; la table de hachage ne permet pas d'insérer des valeurs nulles, contrairement à hashmap !

2 Que faire si plusieurs threads modifient une collection simultanément

Utilisez l'ancien vecteur/table de hachage. class

StringBuffer est thread-safe, tandis que StringBuilder n'est pas thread-safe. Sans une compréhension approfondie de la sécurité et de l'insécurité, il est facile de créer l'illusion que toutes les opérations sur StringBuffer sont thread-safe. Cependant, la sécurité des threads garantie par Java signifie que l'exécution de sa méthode est exclusive. plusieurs appels à l'objet lui-même, il est toujours en sécurité. Regardez l'exemple ci-dessous. Il existe un contenu de membre de données dans StringBufferTest, qui est utilisé pour l'expansion. Chaque ajout est thread-safe, mais la combinaison de plusieurs ajouts n'est pas thread-safe. mais si vous ajoutez le mot-clé synchronisé aux méthodes log et getContest, les résultats deviendront très organisés. Si vous passez à StringBuider ou même ajoutez à mi-chemin, cela cédera également la place à d'autres threads fonctionnant sur cette base :

public class StringBufferTest {
  private StringBuffer contents = new StringBuffer();
  public void log(String message){
   contents.append(System.currentTimeMillis());
   contents.append("; ");
   contents.append(Thread.currentThread().getName());
   for(int i=0;i<10000;i++){
    contents.append(i);  
     contents.append(message);  //append本身是线程安全的,修改contents时,其它线程无法访问。
     contents.append("\n");
   }
   contents.append("\n\n");
  }
  public void getContents(){
   System.out.println(contents);
  }
}
 
class RunThread extends Thread{
  String message;
  StringBufferTest buffer;
  public RunThread(StringBufferTest buffer, String message){
   this.buffer = buffer;
   this.message = message;
  }
  public void run(){
   while(true){
     buffer.log(message);
     buffer.getContents();
   }
  }
  public static void main(String[] args) {
   StringBufferTest ss = new StringBufferTest();
   new RunThread(ss, "you").start();
   new RunThread(ss, "me").start();
   new RunThread(ss, "she").start();
  }
}
Copier après la connexion

Les méthodes de StringBuilder et StringBuffer sont exactement les mêmes, c'est un problème multi-thread et mono-thread. Lorsqu'un thread appelle la méthode append du même StringBuffer, cela n'a rien à voir avec le fait qu'il soit thread-safe. À moins que votre résultat ne soit que la série de chaînes ajoutée est gâchée, cela signifie qu'elle n'est pas sécurisée pour les threads. La sécurité des threads signifie qu’un seul thread peut accéder aux ressources critiques à tout moment. La sécurité des threads ne signifie pas que ses séries d'opérations sont synchronisées, mais que les autres threads ne sont pas autorisés à changer lorsqu'il exécute une certaine méthode. Le fait qu'une classe soit thread-safe en dépend. Plusieurs threads s'exécutent en même temps, et ces threads peuvent exécuter une certaine méthode en même temps. Mais le résultat de chaque opération est le même que celui d'une exécution monothread, on peut donc dire qu'elle est thread-safe. Étant donné que la méthode de journalisation n'est pas verrouillée, tout le monde peut obtenir des fragments d'exécution du processeur une fois le verrou d'ajout libéré.

Mais ne vous méprenez pas sur la sécurité multithread :

public String toString(){
  StringBuffer buffer = new StringBuffer();
  buffer.append(&#39;<&#39;);
  buffer.append(this.name);
  buffer.append(&#39;>&#39;);
  return buffer.toString();
 }
Copier après la connexion

Ce code est entièrement thread-safe. Les variables définies à l'intérieur de la méthode seront créées lors de l'entrée de chaque thread ! Il n’y a aucun problème de sécurité des threads. Généralement, les variables liées à la sécurité du système sont généralement des variables membres. L'implémentation interne de stringBuffer elle-même est sécurisée pour le site ! La sécurité des threads signifie que les fonctions fournies par la classe elle-même sont sûres. Autrement dit, si vous insérez une chaîne, alors cette insertion de chaîne est sûre, mais vous devez insérer deux chaînes et vous décidez de l'ordre des deux chaînes. S'il y a d'autres erreurs d'insertion entre-temps, la classe n'aura pas d'importance. . Oui Problème avec votre propre code.

Merci d'avoir lu, j'espère que cela pourra vous aider, merci pour votre soutien à ce site !

Pour plus d'articles sur la sécurité des threads sur les classes dans les collections Java, veuillez prêter attention au site Web PHP 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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

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)

Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Apr 19, 2025 pm 04:51 PM

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Apr 19, 2025 pm 06:21 PM

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Apr 19, 2025 pm 11:42 PM

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Apr 19, 2025 pm 11:45 PM

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Apr 19, 2025 pm 11:30 PM

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Comment obtenir élégamment les conditions de requête de création de nom de variable de classe d'entité lors de l'utilisation de tkmybatis pour la requête de base de données? Comment obtenir élégamment les conditions de requête de création de nom de variable de classe d'entité lors de l'utilisation de tkmybatis pour la requête de base de données? Apr 19, 2025 pm 09:51 PM

Lorsque vous utilisez TkMyBatis pour les requêtes de base de données, comment obtenir gracieusement les noms de variables de classe d'entité pour créer des conditions de requête est un problème courant. Cet article épinglera ...

Comment convertir en toute sécurité les objets Java en tableaux? Comment convertir en toute sécurité les objets Java en tableaux? Apr 19, 2025 pm 11:33 PM

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Apr 19, 2025 pm 11:27 PM

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...

See all articles