Collection CopyOnWrite
Nous avons exploré de nombreuses collections synchronisées ensemble, et si vous avez maîtrisé les autres, vous trouverez celle-ci encore plus simple à comprendre.
Exemple concret
Une application web qui utilise CopyOnWriteArrayList pour stocker les abonnés aux événements. Plusieurs threads peuvent simultanément récupérer la liste actuelle des abonnés afin de les notifier des changements, tandis que d'autres threads peuvent ajouter ou supprimer des abonnés.
Différences par rapport aux autres types
Les collections CopyOnWrite créent une copie de la collection à chaque modification, garantissant que les opérations de lecture ne sont pas bloquées par les changements de données, assurant ainsi la sécurité des threads lors des lectures, bien que les opérations d'écriture ne soient pas thread-safe car elles s'effectuent sur une copie distincte de la collection.
Vues CopyOnWrite :
Comme nous pouvons le voir sur l’illustration, lors de l’ajout d’un nouvel élément, une copie de cette structure de données est créée. Tous les threads qui utilisaient cette collection avant sa modification poursuivront leur exécution sans aucun problème, car ces changements n’affecteront pas la copie CopyOnWrite qu’ils utilisent !
CopyOnWriteArraySet
CopyOnWriteArraySet est une implémentation thread-safe d’un ensemble basée sur CopyOnWriteArrayList. Elle garantit la sécurité des threads en créant une nouvelle copie de l’ensemble de base à chaque modification, telle que l’ajout ou la suppression d’éléments.
Cette approche est particulièrement utile lorsque l’ensemble est souvent lu et rarement modifié, car elle offre une vue cohérente de l’ensemble pour tous les threads sans nécessiter de synchronisation.
CopyOnWriteArrayList
CopyOnWriteArrayList est une variante thread-safe de ArrayList qui assure la sécurité des threads en créant une nouvelle copie du tableau sous-jacent à chaque modification.
Cette conception propose un itérateur tolérant aux erreurs qui ne lève pas d’exception ConcurrentModificationException car il fonctionne sur un instantané du tableau pris au moment de la création de l’itérateur. Elle convient particulièrement aux situations où les opérations de lecture sont nettement plus fréquentes que les opérations d’écriture, car la surcharge liée à la copie complète du tableau à chaque écriture peut être importante.
Exemple pratique de cas d'utilisation
Méthodes de la collection CopyOnWrite
addIfAbsent(E e) : Ajoute un élément à la liste uniquement s'il n'est pas déjà présent dans la liste/plusieurs.
Main.java
123456789101112131415161718192021package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }
Dans cet exemple, « apple » n'est pas ajouté de nouveau car il existe déjà dans la liste. La méthode addIfAbsent() empêche les doublons, garantissant l'unicité des éléments.
addAllAbsent(Collection<? extends E> c) : Ajoute tous les éléments de la collection spécifiée à la liste/multiple, en ignorant les éléments déjà existants.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }
Dans cet exemple, « banana » est déjà présent dans la liste, donc addAllAbsent() ne l’ajoutera pas à nouveau. La méthode garantit que seuls les éléments uniques de la collection fournie sont ajoutés à la liste.
Toutes les autres méthodes des collections CopyOnWrite sont similaires à celles de leurs collections parentes ; elles copient simplement l’état de la collection chaque fois que des modifications sont effectuées.
Limitations et avantages
😔Limitations :
Les collections CopyOnWrite présentent des limitations notables. Elles entraînent un coût mémoire en raison de la création d’une nouvelle copie de la collection à chaque modification, ce qui peut être conséquent. Cette conception les rend moins adaptées aux scénarios nécessitant des modifications fréquentes des données.
💪Avantages :
À l’inverse, les collections CopyOnWrite offrent des avantages significatifs. Elles sont très efficaces pour la lecture de données dans un environnement multithreadé. Ces collections offrent d’excellentes performances dans les situations où les opérations de lecture sont nettement plus nombreuses que les opérations d’écriture, ce qui en fait un excellent choix pour ces cas d’utilisation.
Cependant, en raison de la copie à chaque modification, les collections CopyOnWrite peuvent consommer davantage de mémoire et ne conviennent pas aux scénarios comportant des opérations d'écriture fréquentes. Elles sont les plus efficaces lorsque les opérations de lecture prédominent sur les opérations d'écriture.
1. Que se passe-t-il lorsque vous appelez la méthode addIfAbsent(E e) dans CopyOnWriteArrayList ?
2. Pourquoi les collections CopyOnWrite sont-elles particulièrement adaptées aux scénarios avec de nombreuses lectures et peu de modifications de données ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
What are some common use cases for CopyOnWrite collections?
Can you explain the main differences between CopyOnWriteArrayList and CopyOnWriteArraySet?
When should I avoid using CopyOnWrite collections?
Awesome!
Completion rate improved to 3.33
Collection CopyOnWrite
Glissez pour afficher le menu
Nous avons exploré de nombreuses collections synchronisées ensemble, et si vous avez maîtrisé les autres, vous trouverez celle-ci encore plus simple à comprendre.
Exemple concret
Une application web qui utilise CopyOnWriteArrayList pour stocker les abonnés aux événements. Plusieurs threads peuvent simultanément récupérer la liste actuelle des abonnés afin de les notifier des changements, tandis que d'autres threads peuvent ajouter ou supprimer des abonnés.
Différences par rapport aux autres types
Les collections CopyOnWrite créent une copie de la collection à chaque modification, garantissant que les opérations de lecture ne sont pas bloquées par les changements de données, assurant ainsi la sécurité des threads lors des lectures, bien que les opérations d'écriture ne soient pas thread-safe car elles s'effectuent sur une copie distincte de la collection.
Vues CopyOnWrite :
Comme nous pouvons le voir sur l’illustration, lors de l’ajout d’un nouvel élément, une copie de cette structure de données est créée. Tous les threads qui utilisaient cette collection avant sa modification poursuivront leur exécution sans aucun problème, car ces changements n’affecteront pas la copie CopyOnWrite qu’ils utilisent !
CopyOnWriteArraySet
CopyOnWriteArraySet est une implémentation thread-safe d’un ensemble basée sur CopyOnWriteArrayList. Elle garantit la sécurité des threads en créant une nouvelle copie de l’ensemble de base à chaque modification, telle que l’ajout ou la suppression d’éléments.
Cette approche est particulièrement utile lorsque l’ensemble est souvent lu et rarement modifié, car elle offre une vue cohérente de l’ensemble pour tous les threads sans nécessiter de synchronisation.
CopyOnWriteArrayList
CopyOnWriteArrayList est une variante thread-safe de ArrayList qui assure la sécurité des threads en créant une nouvelle copie du tableau sous-jacent à chaque modification.
Cette conception propose un itérateur tolérant aux erreurs qui ne lève pas d’exception ConcurrentModificationException car il fonctionne sur un instantané du tableau pris au moment de la création de l’itérateur. Elle convient particulièrement aux situations où les opérations de lecture sont nettement plus fréquentes que les opérations d’écriture, car la surcharge liée à la copie complète du tableau à chaque écriture peut être importante.
Exemple pratique de cas d'utilisation
Méthodes de la collection CopyOnWrite
addIfAbsent(E e) : Ajoute un élément à la liste uniquement s'il n'est pas déjà présent dans la liste/plusieurs.
Main.java
123456789101112131415161718192021package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }
Dans cet exemple, « apple » n'est pas ajouté de nouveau car il existe déjà dans la liste. La méthode addIfAbsent() empêche les doublons, garantissant l'unicité des éléments.
addAllAbsent(Collection<? extends E> c) : Ajoute tous les éléments de la collection spécifiée à la liste/multiple, en ignorant les éléments déjà existants.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }
Dans cet exemple, « banana » est déjà présent dans la liste, donc addAllAbsent() ne l’ajoutera pas à nouveau. La méthode garantit que seuls les éléments uniques de la collection fournie sont ajoutés à la liste.
Toutes les autres méthodes des collections CopyOnWrite sont similaires à celles de leurs collections parentes ; elles copient simplement l’état de la collection chaque fois que des modifications sont effectuées.
Limitations et avantages
😔Limitations :
Les collections CopyOnWrite présentent des limitations notables. Elles entraînent un coût mémoire en raison de la création d’une nouvelle copie de la collection à chaque modification, ce qui peut être conséquent. Cette conception les rend moins adaptées aux scénarios nécessitant des modifications fréquentes des données.
💪Avantages :
À l’inverse, les collections CopyOnWrite offrent des avantages significatifs. Elles sont très efficaces pour la lecture de données dans un environnement multithreadé. Ces collections offrent d’excellentes performances dans les situations où les opérations de lecture sont nettement plus nombreuses que les opérations d’écriture, ce qui en fait un excellent choix pour ces cas d’utilisation.
Cependant, en raison de la copie à chaque modification, les collections CopyOnWrite peuvent consommer davantage de mémoire et ne conviennent pas aux scénarios comportant des opérations d'écriture fréquentes. Elles sont les plus efficaces lorsque les opérations de lecture prédominent sur les opérations d'écriture.
1. Que se passe-t-il lorsque vous appelez la méthode addIfAbsent(E e) dans CopyOnWriteArrayList ?
2. Pourquoi les collections CopyOnWrite sont-elles particulièrement adaptées aux scénarios avec de nombreuses lectures et peu de modifications de données ?
Merci pour vos commentaires !