CopyOnWriteArrayList
Les opérations add , set , remove sur une collection donnée entraînent la création d'une nouvelle copie du tableau interne. Cela garantit que nous n'attrapons pas ConcurrentModificationException .
N'oubliez pas que lors de la copie d'un tableau, seules les références aux objets sont copiées, y compris l'accès aux champs des éléments non thread-safe. Ces collections sont mieux utilisées dans les cas avec un nombre minimum d'opérations d'écriture.
CopyOnWriteArrayList<E> est un analogue thread-safe de ArrayList , implémenté sur la base des algorithmes CopyOnWrite. Des méthodes et un constructeur supplémentaires sont décrits ci-dessous :
CopyOnWriteArrayList(E[] versCopyIn) | Un constructeur qui prend un tableau en entrée. |
int indexOf(E e, int index) | Renvoie l'index du premier élément trouvé, en commençant à l'index donné. |
int lastIndexOf(E e, int index) | Renvoie l'index du premier élément trouvé dans une recherche inversée, en commençant à l'index donné. |
booléen addIfAbsent(E e) | Ajoutez un élément s'il n'est pas dans la collection. La méthode equals est utilisée pour comparer des éléments . |
int addAllAbsent(Collection<? étend E> c) | Ajoutez des éléments s'ils ne sont pas dans la collection. Renvoie le nombre d'éléments ajoutés. |
Interface ConcurrentMap
Implémentations améliorées de HashMap et TreeMap avec prise en charge du multithreading et de l'évolutivité.
ConcurrentMap<K, V> est une interface qui étend Map avec des opérations atomiques supplémentaires.
V putIfAbsent(touche K, valeur V) | Ajoute une nouvelle paire clé-valeur uniquement si la clé ne se trouve pas dans la collection. Renvoie la valeur précédente pour la clé donnée. |
boolean remove (clé d'objet, valeur d'objet) | Supprime la paire clé-valeur uniquement si la clé donnée correspond à la valeur donnée dans le Map. Renvoie vrai si l'élément a été supprimé avec succès. |
remplacement booléen (touche K, V ancienne valeur, V nouvelle valeur) | Remplace l'ancienne valeur par la nouvelle par clé uniquement si l'ancienne valeur correspond à la valeur donnée dans la carte. Renvoie true si la valeur a été remplacée par une nouvelle. |
V remplacer (touche K, valeur V) | Remplace une ancienne valeur par une nouvelle par clé uniquement si la clé est associée à une valeur. Renvoie la valeur précédente pour la clé donnée. |
ConcurrentHashMap<K, V> - ici, les données sont présentées sous forme de segments, qui sont divisés en hachages clés. Par conséquent, si vous avez besoin d'un accès, le segment est verrouillé, pas l'objet. Les itérateurs ne lèvent pas ConcurrentModificationException et représentent les données pendant une période de temps spécifique.
Implémentations de ConcurrentHashMap
ConcurrentHashMap<K, V> - ici, les données sont présentées sous forme de segments, décomposés par hachages clés. Par conséquent, l'accès aux données est verrouillé par segments, et non par un objet. De plus, les itérateurs représentent des données pour une tranche de temps spécifique et ne lancent pas ConcurrentModificationException .
ConcurrentNavigableMap<K,V> - étend l'interface NavigableMap et renvoie un ConcurrentNavigableMap . Tous les itérateurs peuvent être utilisés en toute sécurité et ne lancent pas ConcurrentModificationException .
ConcurrentSkipListMap<K, V> est un analogue de TreeMap pour le multithreading. Les données sont triées par clé et les performances log(N) moyennes sont garanties pourcontainsKey,get,put,removeet d'autres opérations similaires.
ConcurrentSkipListSet<E> est une implémentation de l' interface Set basée sur ConcurrentSkipListMap .