La diferencia entre Vector y SynchronizedList en Java

La diferencia entre Vector y SynchronizedList en Java

Hola, estoy mirando las montañas.

Este artículo todavía está lanzando sobre las colas en Java. La última vez que comparé Vector, ArrayList, CopyOnWriteArrayList, SynchronizedList , me sentí bastante claro en ese momento, pero no lo entendí después de pensarlo, así que hoy lo resolví y lo estudié de nuevo. Admito que me quedé atascado. Arriba.

VectorAunque hay varios problemas, todos son problemas de diseño, ¿por qué no optimizar en versiones posteriores? HashMapSe ha optimizado varias veces. Y SynchronizedListesta clase interna (es decir, Collections.synchronizedList(new ArrayList())creada) también usa un Vectormétodo de sincronización similar (la diferencia es una en el cuerpo del método y la otra en el bloque del método, la diferencia no es grande), ¿por qué aún lo abandonas Vector?

De hecho, en el JDK Vectorno se ha marcado como Deprecated, es decir, aunque Vectorhay varios problemas en el mundo exterior , pero desde el funcionario del JDK, nunca ha considerado inútil a este hijo.

Por lo tanto, Vectorsolo hay dos razones por las que no lo usa :

  1. Otras colas son Vectormás adecuadas que las mejores
  2. Todo el mundo dice que Vectorno es fácil de usar, entonces ya no lo necesito [personalmente creo que esta probabilidad es mayor]

Debido a que es Vectorprincipalmente una estructura de matriz, la mayoría de las siguientes comparaciones son para ArrayListempaquetamiento síncrono.

Con Vectorporque haySynchronizedList

La respuesta a esta pregunta se encuentra en StackOverflow.

Antes de JDK 1.2, Collectionsera una biblioteca de clases independiente, no parte de JDK / JRE. El synchronizedrendimiento era particularmente pobre en ese momento y muchos escenarios no necesitaban usar sincronización, por lo que los desarrolladores de la biblioteca de clases independientes eliminaron la operación de sincronización, que debería ser ArrayListla predecesora. Sin embargo, una pequeña cantidad de escenarios todavía necesitan usar la sincronización, por lo que existe una clase contenedora que SynchronizedListpuede envolver todas las Listsubclases. Esta clase agrega synchronizedsincronización a casi todos los métodos. Este diseño es Vectorsimilar.

Los antiguos decían que "los literatos son más ligeros", de hecho, hay una cadena de desprecio en el mundo de la codificación. Aquí está: Aunque mi diseño es similar al tuyo, mi diseño es mejor que el tuyo. Sin embargo, el Collectionsdiseño es realmente mejor.

Uno SynchronizedListpara toda la Listsincronización

SynchronizedListEl posicionamiento es una categoría de empaque, que puede empaquetar todas las Listsubcategorías. Es decir, no importa si está ArrayListo LinkedListpuede sincronizarse, la estructura de datos subyacente no se modificará en absoluto, lo que no solo logra la sincronización, sino que también conserva las ventajas de la interfaz subyacente. Por ejemplo LinkedList, la eficiencia de inserción y eliminación ArrayListy lectura secuencial. Además, una clase contenedora puede resolver Listlos requisitos de sincronización de todas las subclases y no es necesario repetir la implementación en absoluto.

En términos relativos, Vectores más dominante: cualquier cola que desee sincronizar debe convertirse en Vectoruna estructura de matriz. Todo el mundo sabe que el almacenamiento de arreglos requiere espacio continuo y la eficiencia de lectura secuencial es excelente, pero la eficiencia de inserción y eliminación es relativamente baja.

Entregar los derechos de sincronización del iterador al usuario.

El método de sincronización SynchronizedListy Vectores muy similar, pero el método del iterador tiene una idea diferente.

Ver el código fuente de conocimientos, SynchronizedListen iteratory listIteratorno están sincronizados métodos, por lo que no quede bloqueado en el tiempo iterador.

public Iterator<E> iterator() {
    
    
    return list.iterator(); // Must be manually synched by user!
}

public ListIterator<E> listIterator() {
    
    
    return list.listIterator(); // Must be manually synched by user
}

public ListIterator<E> listIterator(int index) {
    
    
    return list.listIterator(index); // Must be manually synched by user
}

Si necesita iterar, simplemente synchronizedenvuelva el objeto de cola directamente , el código es el siguiente:

final List<String> list = Collections.synchronizedList(new ArrayList());
list.add("A");
list.add("B");
list.add("C");
final Iterator<String> iterator = list.iterator();

synchronized (list) {
    
    
    while (iterator.hasNext()) {
    
    
        final String next = iterator.next();
        System.out.println(next);
    }
}

Veamos la Vectorimplementación del iterador:

/**
    * An optimized version of AbstractList.Itr
    */
private class Itr implements Iterator<E> {
    
    
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;

    public boolean hasNext() {
    
    
        // Racy but within spec, since modifications are checked
        // within or after synchronization in next/previous
        return cursor != elementCount;
    }

    public E next() {
    
    
        synchronized (Vector.this) {
    
    
            checkForComodification();
            int i = cursor;
            if (i >= elementCount)
                throw new NoSuchElementException();
            cursor = i + 1;
            return elementData(lastRet = i);
        }
    }

    public void remove() {
    
    
        if (lastRet == -1)
            throw new IllegalStateException();
        synchronized (Vector.this) {
    
    
            checkForComodification();
            Vector.this.remove(lastRet);
            expectedModCount = modCount;
        }
        cursor = lastRet;
        lastRet = -1;
    }

    // 此处省略一些方法
}

VectorEl iterador de se usa para synchronized (Vector.this)bloquear, de hecho, también es para bloquear la instancia de clase actual, que es consistente con el método de bloqueo implementado por nosotros mismos. Por supuesto, desde este punto de vista Vector, también es Vectoruna ventaja garantizar que los errores causados ​​por la sincronización se puedan evitar sin que el desarrollador se dé cuenta .

VectorNo del todo inútil

Aunque Vectorperdió en otros lugares Collections, todavía hay otro mérito en términos de expansión de capacidad. Primero mira Vectorel método de expansión:

private void grow(int minCapacity) {
    
    
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                        capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

Al calcular la longitud de la nueva matriz, verificará capacityIncrementsi es mayor que 0 y, si lo es, expandirá capacityIncrementel tamaño. En otras palabras, el Vectortamaño de expansión se puede especificar en. Si no se especifica, la expansión se duplicará de forma predeterminada, pero ArrayListsolo se puede expandir a 1,5 veces y no hay forma de personalizar el tamaño de expansión.

Si lo piensas bien, esto no sirve de nada.

Resumen al final del artículo

  1. VectorLa estructura interna es una matriz y Collections.synchronizedList(new ArrayList())similar.
  2. VectorPuede especificar el tamaño de expansión, y el valor predeterminado es expandir al doble de la longitud de la matriz original; no ArrayListpuede especificar el tamaño de expansión y expandir directamente a 1,5 veces el tamaño de la matriz original.
  3. SynchronizedListEs una clase de empaquetado que puede envolver todas las subclases Listen una cola síncrona, desde una cola no segura para subprocesos hasta una cola segura para subprocesos, sin demora en el rendimiento, simplemente envuélvala directamente; Vectores una cola síncrona basada en matrices, y otras las colas a las que se desea convertir Vector, se requiere copia de datos.
  4. SynchronizedListEl iterador de no está sincronizado y debe ser implementado Vectorpor el usuario; el iterador de está sincronizado y los desarrolladores no necesitan preocuparse por la sincronización.
  5. VectorHasta ahora no está marcado Deprecatedy, con el lanzamiento del JDK, la implementación también se está actualizando. Aunque el JDK promete ser compatible, no se ha marcado como caducado y se desconoce su intención.

Lectura recomendada

  1. Conozca las colas en Java: Vector, ArrayList, CopyOnWriteArrayList, SynchronizedList
  2. ¿Qué sucede si tiene que usar ArrayList en varios subprocesos?
  3. ¿Por qué la clase Java Vector (y Stack) se considera obsoleta o en desuso?
  4. En java, Vector y Collections.synchronizedList están todos sincronizados, ¿cuál es la diferencia?

Hola, estoy mirando la montaña, la cuenta pública: mirando la cabaña de la montaña, un simio de 10 años, Apache Storm, WxJava, colaborador de código abierto de Cynomys. Nada en el mundo de los códigos, disfruta de la vida en el drama.

Página de inicio personal: https://www.howardliu.cn
Publicación de blog personal: La diferencia entre Vector y Collections.synchronizedList (nueva ArrayList ()) en la
página de inicio de Java CSDN: http://blog.csdn.net/liuxinghao
Publicación de blog de CSDN: Vector en Java La diferencia con Collections.synchronizedList (new ArrayList ())

Número público: Mirando el refugio de montaña

Supongo que te gusta

Origin blog.csdn.net/conansix/article/details/114238758
Recomendado
Clasificación