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