Vous êtes sur la page 1sur 1

Thread safety collections in Java

Thread safety este un concept de programare aplicabil codului multi-threading. Thread


safety manipulează structurile de date partajate într-o manieră care asigură faptul că toate firele se
comportă corect și își îndeplinesc specificațiile de proiectare fără o interacțiune neintenționată.
Există diferite strategii pentru crearea unor structure de date thread-safe.
Toate colecțiile din java.util (ArrayList, LinkedList, HashMap, HashSet, TreeMap,
TreeSet, etc) nu sunt sincronizate și nici thread safety, cu excepția Vector și Hashtable. De ce?
Deoarece sincronizarea este foarte costisitoare.
Vector și Hashtable sunt cele două colecții existente la începutul istoriei Java și sunt
concepute pentru a fi thread-safe de la început. Cu toate acestea, ele au o performanța slabă în
programarea multi-threaded. Acest lucru se datorează faptului că sincronizarea necesită elemente
de blocare, care necesită întotdeauna timp pentru monitorizare și care reduce din performanță. De
aceea, noile colecții (List, Set, Map, etc) nu oferă nici un control al concurenței pentru a oferi
performanțe maxime în aplicațiile cu un singur thread.
Astfel, Java vine cu o bibliotecă specială de colecții concurente java.util.concurrent,
precum:
1. BlockingQueue definește o structură first-in-first-out, care care blochează sau expiră atunci
când se încearcă adăugarea unui elemente într-o coada completă sau preluarea unui element
dintr-o coadă goală.
2. ConcurrentMap este o subinterfață a java.util.Map care definește operațiile atomice utile.
Aceste operațiuni elimină sau înlocuiesc o pereche cheie-valoare numai dacă cheia este
prezentă sau adaugă o pereche cheie-valoare numai dacă cheia este absentă. Realizarea
acestor operații atomice ajută la evitarea sincronizării. Implementarea generală standard a
ConcurrentMap este ConcurrentHashMap, care este un analog al HashMap.
3. ConcurrentNavigableMap ste o subinterfață a ConcurrentMap care acceptă potriviri
aproximative. Implementarea generală standard a ConcurrentNavigableMap este
ConcurrentSkipListMap, care este un analog al TreeMap.
O altă abordare sunt colecțiile sincronizate wrappers, SynchronizedMap și
synchronizedList, care sunt uneori numite conditionally thread-safe - toate operațiunile individuale
sunt thread-safe, dar secvențele de operații în care fluxul de control depinde de rezultatele
operațiilor anterioare și pot face obiectul rapoartelor de date. Dar, pot apărea probleme la iterarea
aceleiași colecții din diferite fire de execuție. Conditional thread safety furnizată de
synchronizedList și synchronizedMap prezintă un pericol ascuns - dezvoltatorii presupun că,
deoarece aceste colecții sunt sincronizate, ele sunt complet protejate de fir și neglijează
sincronizarea corectă a operațiilor compuse. Rezultatul este că, în timp ce aceste programe par să
funcționeze sub sarcină ușoară, în condiții de încărcare mare pot începe să arunce
NullPointerException sau ConcurrentModificationException.

Bibliografie
1. http://www.codejava.net/java-core/collections/understanding-collections-and-thread-safety-in-
java
2. https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html
3. https://www.ibm.com/developerworks/library/j-jtp07233/
4. https://en.wikipedia.org/wiki/Thread_safety
5. https://www.quora.com/What-are-the-Thread-safe-classes-in-Java-Collections-framework

Vous aimerez peut-être aussi