En C ++, std :: vector est utilisé pour les tableaux de longueur variable, mais en Java, java.util.ArrayList est généralement utilisé, et java.util.Vector, qui semble avoir des fonctions similaires, est utilisé. ne pas.
――Il semble lent car il se synchronise
--Si vous voulez une liste synchronisée, vous devez utiliser java.util.Collections.synchronizedList ()
Je m'en fichais jusqu'à présent parce que je pensais avoir entendu une telle histoire il y a longtemps, mais je me suis soudainement intéressé, alors j'ai jeté un coup d'œil à la source d'OpenJDK.
Chaque méthode a certainement une clause synchronisée. Vous devez absolument utiliser ʻArrayList` lorsque vous n'avez pas besoin de synchronisation.
Vector.java
...
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
...
public synchronized boolean add(E e) {
modCount++;
add(e, elementData, elementCount);
return true;
}
...
Alors, quelle est la différence entre Vector et Collections.SynchronizedList (new ArrayList <> ()) encapsulé avec ʻArrayList? Ce qui est différent à première vue, c'est le comportement d'Iterator. Dans Vector`, la méthode Iterator acquiert également le verrou comme les autres méthodes.
Vector.java
private class Itr implements Iterator<E> {
...
public E next() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
}
}
...
Pour SynchronizedCollections héritées par SyncronizedList, Iterator () renvoie le type d'encapsulation tel quel.
Collections.java
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
...
public Iterator<E> iterator() {
return c.iterator(); // Must be manually synched by user!
}
Si vous souhaitez parcourir une liste, obtenir le verrou uniquement dans une seule méthode ne suffit pas, et vous devrez éventuellement verrouiller vous-même tout le processus itératif ("doit être synchronisé manuellement"). par l'utilisateur! ") Peut-être que cela signifie.
--Vector s'est synchronisé pour chaque méthode
Recommended Posts