We hebben al een beetje over synchronisatie gesproken toen we de tutorial op Vector vs ArrayList deelden. Zoals we weten, is ArrayList niet-gesynchroniseerd en mag het niet worden gebruikt in een multi-thread-omgeving zonder expliciete synchronisatie. Dit bericht bespreekt hoe u ArrayList in Java kunt synchroniseren.
Er zijn twee manieren om expliciet te synchroniseren:
- De methode Collections.synchronizedList () gebruiken
- Draadveilige variant van ArrayList gebruiken: CopyOnWriteArrayList
Voorbeeld 1: methode Collections.synchronizedList () voor het synchroniseren van ArrayList
In dit voorbeeld gebruiken we de methode Collections.synchronizedList () . Het be>
pakket delphi-faq.net; java.util.ArrayList importeren; import java.util.Iterator; import java.util.List; import java.util.Collections; Public class Details {public static void main (String a []) {Lijst <String> syncal = Collections.synchronizedList (nieuwe ArrayList <String> ());// Elementen toevoegen aan gesynchroniseerde ArrayListsyncal.add ( "Pen");syncal.add ( "notebook");syncal.add ( "Inkt");System.out.println ("Gesynchroniseerde ArrayList herhalen:");gesynchroniseerd (syncal) {Iterator <String> iterator = syncal.iterator (); terwijl (iterator.hasNext ()) System.out.println (iterator.next ());}} }
Output:
Gesynchroniseerde ArrayList herhalen: Pen NoteBook Inkt
Methode 2: CopyOnWriteArrayList gebruiken
CopyOnWriteArrayList is een thread-veilige variant van ArrayList
.
pakket delphi-faq.net; java.util.concurrent.CopyOnWriteArrayList importeren; import java.util.Iterator; Public class Details { public static void main (String a []) { CopyOnWriteArrayList <String> al = new CopyOnWriteArrayList <String> (); // Elementen toevoegen aan gesynchroniseerde ArrayList al.add ( "Pen"); al.add ( "notebook"); al.add ( "Inkt"); System.out.println ("Gesynchroniseerde ArrayList-elementen weergeven:"); // Gesynchroniseerd blok is niet vereist bij deze methode Iterator <String> iterator = al.iterator (); terwijl (iterator.hasNext ())System.out.println (iterator.next ()); } }
Output:
Gesynchroniseerde ArrayList-elementen weergeven: Pen NoteBook Inkt
Hoi,
In de tweede methode kan ik het pakket niet importeren. Het vraagt me om het argumenttype te verwijderen uit CopyOnWriteArrayList.
Uitvoeringsfout hieronder:
Het type CopyOnWriteArrayList is niet generiek; het kan niet worden geparametriseerd met argumenten.
Kunt u hier alstublieft helpen?
Hallo, in het eerste voorbeeld wanneer ik vervang
Lijst syncal = Collections.synchronizedList (nieuwe ArrayList ());
met List syncal = new ArrayList (); de uitvoer blijft nog steeds hetzelfde.
hoe kunnen we het gebruik van draadveiligheid onderscheiden?