Preguntas de la entrevista de Java: puntos de conocimiento comunes de ArrayList

Escrito antes

Hay muchas preguntas de entrevista para ArrayList en Internet, pero la mayoría de ellas parten de la estructura de datos de ArrayList, como el análisis de problemas de eficiencia como la búsqueda y la modificación. Este artículo quiere comenzar desde la perspectiva de la concurrencia y decirle cómo para responder al problema de concurrencia de ArrayList.

Revisión de la entrevista

Generalmente, temas como los contenedores son más básicos porque generalmente se investigan por un lado, y esto también se ha convertido en un factor clave para determinar si entrar por los dos lados.

Entrevistador: Creo que puedes dominar los conceptos básicos de Java en tu currículum ¿Qué contenedores has usado?

Yo: Hola, entrevistador. ArrayList, LinkedList, HashSet, hashMap, etc. se usan comúnmente en el trabajo general.

Entrevistador: ¿Son todos seguros para subprocesos?

Yo: No es seguro para subprocesos, tendrán problemas de seguridad para subprocesos en situaciones de alta concurrencia.

Entrevistador: ¿Puede escribir un programa para hablar brevemente sobre los problemas con ArrayList?

Por supuesto, en este momento, debe idear el programa que suele acumular.

YO:

De la siguiente manera: abra 20 subprocesos, cada subproceso genera un número aleatorio y agrega el número aleatorio al contenedor de la lista

public class ArrayListUnsafe {
    public static void main(String[] args) {
        List<String> lists = new ArrayList <>();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(lists);
            },String.valueOf(i)).start();
        }
    }
}

En circunstancias normales, este programa informará java.util.ConcurrentModificationException, que también es un error común en situaciones de alta concurrencia, excepción de modificación concurrente

Entrevistador: ¿Por qué ocurre este problema?

Yo: En multiproceso, cada vez que escribes datos en el contenedor, el orden no está garantizado. Quien se apropia del contenedor comienza a escribir los datos. Por lo tanto, puede haber una situación de sobrescritura, lo que da como resultado resultados inconsistentes cada vez.

Entrevistador: ¿Hay alguna forma de evitar este problema?

Yo: Ahora jdk proporciona una variedad de formas de garantizar la seguridad de subprocesos de List.

Utilice la clase de colección tradicional de vectores. Pero esta clase agrega la palabra clave Synchronize al método para garantizar la seguridad de los subprocesos. Pero ya no se recomienda jdK, porque se usa el método de bloqueo pesado, lo que resulta en una baja eficiencia de ejecución.
Utilice las herramientas Collections.synchronizedList para garantizar la seguridad de los subprocesos. Por ejemplo,
List lists = Collections.synchronizedList (new ArrayList <> ());
Use la clase de colección de copia en escritura. CopyOnWriteArrayList
puede decir copy-on-write, que es un elemento adicional, estudiantes. !

Entrevistador: ¿Puede hablar brevemente sobre qué es CopyOnWriteArrayList?

Yo: Copiar en escritura es similar a separar el proceso de lectura y escritura de datos. como

Un subproceso y un subproceso B comienzan a escribir datos. Cada vez que A y B escriben datos, necesitan obtener una licencia (similar a un candado). Los datos en la memoria principal se copian en la memoria de trabajo y luego se modifican. Después de la se completa la modificación Apunte la referencia del contenedor al nuevo conjunto de datos y luego permita que otros subprocesos lo modifiquen.

Código fuente

Por ejemplo, para el método add () de copiar al escribir, el código fuente de jdk es el siguiente:

public boolean add(E e) {
    // 先获取锁,也就是前文说的许可证
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        // 将原数组复制一份
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        // 添加新值
        newElements[len] = e;
        // 将数组索引指向新数组
        setArray(newElements);
        return true;
    } finally {
        // 最后释放锁
        lock.unlock();
    }
}

Cada vez que se agrega un elemento, primero se adquiere el bloqueo (es decir, el permiso) y luego se actualiza el elemento.

Respondido a este nivel, la pregunta de ArrayList se considera una mejor respuesta. Si puede responder cada pregunta en un lado, por qué y cómo hacerlo, será una cuestión de rutina entrar en el segundo lado.

Entrevistador: Está bien, eso es todo por la entrevista de hoy. ¿Cuándo tendrá tiempo para la próxima entrevista? Déjeme arreglarlo.

Jajaja, felicitaciones, la entrevista se ganó con éxito aquí, por favor prepárese para ambas partes felizmente

Yo: Tengo tiempo estos días, dependiendo de sus arreglos.

para resumir

Hay muchos blogs que describen el problema de los contenedores. Si está interesado en la estructura de datos subyacente de ArrayList, puede buscarla usted mismo. Este artículo analiza principalmente las preguntas de la entrevista ArrayList desde la perspectiva de la seguridad de los subprocesos y cómo responderlas en general.

Finalmente, compartiré mi experiencia en entrevistas durante muchos años. En la entrevista, puede responder una pregunta de acuerdo con la lógica de la puntuación total. Primero arroje la conclusión directamente y luego demuestre su conclusión con ejemplos. Asegúrese de captar el corazón del entrevistador por primera vez, de lo contrario es fácil dar a la gente la impresión de no poder captar la clave o el marginal.

Supongo que te gusta

Origin blog.csdn.net/doubututou/article/details/112315548
Recomendado
Clasificación