In C ++ wird "std :: vector" für Arrays variabler Länge verwendet, in Java wird jedoch normalerweise "java.util.ArrayList" verwendet, und "java.util.Vector", das ähnliche Funktionen zu haben scheint, wird verwendet. nicht.
――Es scheint langsam zu sein, weil es synchronisiert
Bis jetzt war mir das egal, weil ich dachte, ich hätte eine solche Geschichte schon vor langer Zeit gehört, aber plötzlich wurde ich interessiert, also schaute ich mir die Quelle von OpenJDK an.
Sicherlich hat jede Methode eine synchronisierte Klausel. Sie sollten auf jeden Fall "ArrayList" verwenden, wenn Sie keine Synchronisation benötigen.
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;
}
...
Was ist also der Unterschied zwischen Vector und Collections.SynchronizedList (new ArrayList <> ())
umwickelt mit ArrayList
?
Was auf den ersten Blick anders ist, ist das Verhalten von Iterator. In Vector
erhält die Iterator-Methode wie andere Methoden auch die Sperre.
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);
}
}
...
Für von SyncronizedList geerbte SynchronizedCollections gibt Iterator () den Wrapping-Typ unverändert zurück.
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!
}
Wenn Sie eine Liste durchlaufen, reicht es nicht aus, die Sperre nur innerhalb einer einzigen Methode zu erhalten. Schließlich müssen Sie den gesamten iterativen Prozess selbst sperren ("Muss manuell synchronisiert werden"). vom Benutzer! ") Vielleicht bedeutet das.
--Vector
wurde für jede Methode synchronisiert
Recommended Posts