Maison > Java > javaDidacticiel > Comment Java JUC exploite-t-il une collection de classes de sécurité List ?

Comment Java JUC exploite-t-il une collection de classes de sécurité List ?

WBOY
Libérer: 2023-04-30 09:10:06
avant
755 Les gens l'ont consulté

Collection non sécurisée

Dans les applications monothread, new ArrayList() est généralement utilisé pour spécifier une collection List pour stocker des données répétables.

Mais en multithreading, des problèmes inattendus surviennent souvent. Le code est le suivant :

import java.util.*;
public class ListTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建list集合
        //List<String> lists = Arrays.asList("1", "2", "3");
        // 不安全
        List<String> lists = new ArrayList<>();

        // 开启十个线程增加数据
        for (int i = 1; i <= 40; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(Thread.currentThread().getName()+"=="+lists);
            },String.valueOf(i)).start();
        }
    }
}
Copier après la connexion

Lorsque plusieurs threads exploitent la même collection d'informations sur les objets, des messages d'erreur d'exception java.util.ConcurrentModificationException apparaissent souvent.

Mesures de sécurité fournies en Java

Dans le langage Java, une nouvelle collection List, la classe java.util.Vector, est fournie. Voir le code suivant pour plus de détails :

import java.util.*;
public class ListTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建list集合
        //List<String> lists = Arrays.asList("1", "2", "3");
        // 不安全
        //List<String> lists = new ArrayList<>();
		List<String> lists = new Vector<>();

        // 开启十个线程增加数据
        for (int i = 1; i <= 40; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(Thread.currentThread().getName()+"=="+lists);
            },String.valueOf(i)).start();
        }
    }
}
Copier après la connexion

Il n'y aura pas d'erreur java.util.ConcurrentModificationException. message.

Pourquoi pouvons-nous garantir le fonctionnement sécurisé des données ?

Java JUC怎么操作List安全类的集合

adopte un verrouillage synchronisé pour l'appelant d'exécution de méthode afin de garantir la sécurité multithread de l'opération d'ajout !

Collection Safe List sous JUC

Dans le cadre du package JUC, les méthodes suivantes pour créer une collection sécurisée sont fournies.

  • Méthode 1 : Collections.synchronizedList(new ArrayList<>());

import java.util.*;
public class ListTest {
    public static void main(String[] args) throws InterruptedException {
		List<String> lists = Collections.synchronizedList(new ArrayList<>());

        // 开启十个线程增加数据
        for (int i = 1; i <= 40; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(Thread.currentThread().getName()+"=="+lists);
            },String.valueOf(i)).start();
        }
    }
}
Copier après la connexion

Affichez le code source sous-jacent pour implémenter la logique

Java JUC怎么操作List安全类的集合

Jugez le type de collection de liste entrante et déterminez si le le type est java. util.RandomAccess, si c'est le cas, utilisez java.util.Collections.SynchronizedRandomAccessList pour construire la collection, sinon, utilisez java.util.Collections.SynchronizedList pour construire la collection.

La logique de l'opération d'ajout correspondante dans le code source est la suivante :

Java JUC怎么操作List安全类的集合

Adoptez un bloc de code de synchronisation synchronisé pour verrouiller l'opération d'ajout de données ! Méthode C 2 : New CopyonWriteArrayList ();

    L'introduction dans le code source de R
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListTest {
    public static void main(String[] args) throws InterruptedException {
        List<String> lists = new CopyOnWriteArrayList<>();

        // 开启十个线程增加数据
        for (int i = 1; i <= 40; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(Thread.currentThread().getName()+"=="+lists);
            },String.valueOf(i)).start();
        }
    }
}
Copier après la connexion
  • est la suivante :

  • Java JUC怎么操作List安全类的集合 Évidemment, la logique est la suivante :

    Java JUC怎么操作List安全类的集合

    Après avoir appelé la méthode ADD , prenez-le, prenez-le, prenez-le, prenez-le, prenez la méthode ADD pour les informations sur l'objet java.util.concurrent.locks.ReentrantLock.

    1. Appelez lock.lock() pour obtenir le verrou !

    2. Copiez l'objet tableau d'origine et créez un nouveau tableau avec la taille du tableau d'origine + 1.

    3. Mettez de nouvelles données dans un nouveau tableau.

    4. Toute opération nécessite finalement le déverrouillage !

    5. En termes de performances, l'opération Lock sous le package JUC a de meilleures performances que la synchronisation !

    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!

    Étiquettes associées:
    source:yisu.com
    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
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal