Programación concurrente (preguntas de la entrevista Java)

1. ¿Qué es un proceso? ¿Qué es un hilo?

El proceso es la unidad más pequeña de asignación de recursos, el subproceso es la unidad más pequeña de programación de CPU, un proceso contiene varios subprocesos

2, habla sobre el ciclo de vida del hilo

El subproceso tiene cinco estados: crear, esperar, ejecutar, bloquear, finalizar, hay tres formas de crear un subproceso, dos no tienen valor de retorno, uno tiene un valor de retorno, el primero es heredar la clase Thread y el segundo es implementar la interfaz Runnable, El tercero es creado por Callable y Future (anula el método Call de la clase Callable, obtiene el valor de retorno de Call a través del método get), después de crear el hilo, el hilo se pone en estado de espera llamando al método de inicio, cuando la CPU programa el hilo Ingrese el estado de ejecución. Si el hilo llama al método de suspensión o al método de espera para ingresar al estado de bloqueo. Luego use el método de interrupción interrupt para lanzar una excepción para despertar el hilo de dormir, o notificar y notificar a All para despertar el hilo de espera e ingresar al grupo de bloqueo de objetos. Hay tres situaciones en las que el hilo terminará: el primero es que el método de ejecución termina, el segundo es llamar al método de detención para forzar el final, y el tercero es usar el método de interrupción interrupción para terminar el hilo en un lugar adecuado

3. ¿Cuáles son las cinco diferencias entre wait () y sleep ()?

Hay cinco diferencias: la primera es que la suspensión no cederá los recursos de la CPU, la espera sí, la segunda es que la suspensión no liberará el bloqueo, la espera sí, la tercera es que la suspensión se puede llamar en cualquier lugar, el método de espera solo se puede sincronizar Llamado en un bloque o método sincrónico, el cuarto es entrar en el estado de espera después de despertarse del sueño y competir por los bloqueos en el grupo de bloqueo del objeto después del despertar. La quinta diferencia es que el método de suspensión es un método de subproceso y esperar es un método de Objeto.

4. ¿Cuál es la diferencia entre wait (), notify (), notifyAll ()?

el hilo que esperar método libera el bloqueo y permitir que los recursos de la CPU, notificar a despertar bloqueo objeto al azar un grupo de subprocesos, notifyAll despertar la cerradura objeto de la piscina
y un poco de hilo, mayor es la probabilidad de que una lucha hilo de mayor prioridad a la cerradura ( setPriority () 1 tiene la prioridad más baja, 10 tiene la prioridad más alta, el valor predeterminado es 5
, thread.setPriority (1))

5. ¿Cuál es el papel de volátil?

Asegurar la visibilidad entre los hilos, para evitar que la instrucción reordenamiento, cada lectura modificada variable cuando se lee directamente de la memoria principal (región hilo común), en lugar de
leer de la memoria de trabajo (rosca región privada, pila) de Fetch, para que el hilo pueda garantizar que se lea el último valor cada vez. Sin embargo, Volatile solo puede garantizar la
visibilidad entre hilos, pero no la atomicidad. Si dos hilos copian variables en la memoria de trabajo al mismo tiempo y las copian en la memoria principal después de la modificación
, habrá un problema. Como acabo de decir, leer en la memoria de trabajo es en realidad el área de caché de trabajo que se copia. El área de caché de trabajo es un concepto abstracto.
No hay división de esta área en el jvm. La máquina virtual determina la ubicación específica. Siempre que se ajuste a la especificación JMM.

6. Escenarios de aplicación de volátiles?

No hay necesidad de garantizar la seguridad del hilo. Por ejemplo, el método de ejecución tiene una variable modificada por Volatile como un interruptor. Cuando el interruptor es falso, sale del bucle.

7. ¿Cuáles son las tres diferencias entre volátil y sincronizado?

La primera es que la volatilidad es una sincronización ligera (no exclusiva, la atomicidad no está garantizada), la sincronización es una sincronización pesada (exclusiva, la conmutación de la CPU consume recursos). La segunda es que la volatilidad no garantiza la atomicidad, mientras que la sincronización garantiza la atomicidad. Para garantizar la visibilidad, el tercero es que el volátil solo puede modificar variables, sincronizado puede modificar bloques de código y métodos

8. ¿Cuándo ocurrirá un punto muerto? ¿Cómo evitar el punto muerto?

Hay cuatro condiciones para un punto muerto: exclusión mutua, no preferencia, solicitud y retención y espera de bucle. Hay dos formas de evitar puntos muertos: el primero es el orden de bloqueo debe ser coherente y el segundo es establecer un tiempo de espera para el bloqueo.

9. ¿Cómo establecer un tiempo de espera para la cerradura?

10. ¿Cómo usar el código para darse cuenta de los problemas del productor y el consumidor?

Cree una clase de recurso, establezca el número máximo de recursos en 10, el número actual de recursos es 0, hay métodos de eliminación y colocación en la clase, método de eliminación para determinar si el número actual de recursos es 0, llame al método de espera para esperar 0, Recurso distinto de cero: finalmente use la notificación para activar otros subprocesos (¿por qué no notificar a todos para despertar a todos? Debido a que uno se despierta también es aleatorio, todos los despertadores también son contención aleatoria para bloqueos, por supuesto, cuanto menor es el número, menor es el consumo de recursos) Del mismo modo, para determinar si el recurso ha alcanzado el valor máximo, espere si lo alcanza, y resource ++ si no, y finalmente active otros hilos. Las clases de consumidor y productor usan una combinación para llamar a los métodos remove y put de la clase de recurso para crear e iniciar hilos de productor de consumidor, respectivamente.

11. El principio de realización de Sincronizado?

Antes de jdk1.6, sincronizado es un peso pesado, pero después de la optimización continua, se vuelve muy poderoso después de jdk1.6 El bloqueo sincronizado tiene cuatro estados: sin bloqueo, bloqueo de polarización, bloqueo ligero y bloqueo de peso pesado. A medida que el estado de la competencia se actualiza gradualmente, no se puede degradar. Cuando se adquiere el bloqueo por primera vez, la información de bloqueo en el encabezado del objeto Mark word se modificará a través de CAS. El bloqueo se actualizará de CAS a un bloqueo sesgado. Mark Word registra el ID del hilo. Sin la competencia de otros hilos, no hay necesidad de bloquear y desbloquear a través de CAS, y el hilo sesgado siempre tendrá el bloqueo sesgado. Cuando un hilo quiere competir por un bloqueo sesgado, se producirá la cancelación del bloqueo. Si el hilo que sostiene el bloqueo sesgado ha salido del bloque de código sincronizado o no está activo, entonces el hilo que mantiene el bloqueo sesgado se colocará provisionalmente en un lugar seguro y luego se liberará. Bloquee y luego active el hilo que contiene el bloqueo sesgado (¿interrupción?). Los hilos competidores modifican el ID del hilo sesgado en la palabra Marcar a través de CAS para obtener el bloqueo sesgado. Si se produce competencia y el hilo que contiene el bloqueo sesgado no sale del bloque de código sincronizado, entonces el bloqueo sesgado se actualizará a un bloqueo ligero, y la JVM abrirá un espacio para almacenar información de bloqueo en la pila del hilo sesgado y almacenará la copia de MarkWord en el encabezado del objeto. MarkWord en el encabezado del objeto se reemplaza con un puntero a la información de bloqueo en la pila. Cuando se libera el bloqueo liviano
, MarkWord se vuelve a colocar en la cabeza del objeto nuevamente y luego se despierta el hilo que originalmente sostenía el bloqueo sesgado. El hilo de la competencia intenta reemplazar a MarkWord con un puntero a la información en la pila. Si el reemplazo tiene éxito, se obtiene un bloqueo liviano. Si el reemplazo falla, el giro falla, y el número de giros se actualiza a un bloqueo de peso pesado. El bloqueo de peso pesado del monitor se basa en el monitor y La instrucción monitorexit se implementa, el monitor se inserta en la posición de inicio y el monitor se inserta en la posición final. La JVM debe asegurarse de que cada monitor tiene un monitor asociado y cada objeto tiene un monitor asociado. Cuando se mantiene un monitor, El objeto será bloqueado. Cuando el hilo ejecuta la instrucción del monitor, intenta adquirir la propiedad del monitor correspondiente al bloqueo del objeto, es decir, intenta adquirir el bloqueo del objeto.

12. ¿Cuál es la diferencia entre este bloqueo, bloqueo de objeto y bloqueo de clase?

Este bloqueo bloquea la instancia actual, el bloqueo de objeto bloquea el objeto especificado, el bloqueo de clase bloquea el objeto de clase, Sincronizado es este bloqueo cuando se modifica el método ordinario y User.class.wait () libera el bloqueo, y el método estático está decorado Es un bloqueo de clase, puede especificar el tipo de bloqueo al decorar el bloque de código, la esencia es usar el monitor

13. ¿Cuáles son los tipos comunes de cerraduras?

Bloqueo CAS: se utilizan tres operandos básicos en el mecanismo AS: dirección de memoria V, antiguo valor esperado A y nuevo valor B a modificar. Al actualizar una variable, el valor correspondiente a la dirección de memoria V se cambiará a B solo cuando el valor esperado A de la variable y el valor real en la dirección de memoria V sean los mismos. Spin lock: es a través de CAS para determinar continuamente si se cumple la condición de bloqueo. Bloqueo optimista: desde el principio, se cree que la ejecución será exitosa y está controlada por el número de versión o la marca de tiempo. CAS es un bloqueo optimista. Bloqueos pesimistas: al principio, se creía que no se ejecutaría con éxito, y la contención de los bloqueos fue seguida primero por la ejecución de la lógica empresarial. Bloqueo reentrante: una vez que la capa externa adquiere el bloqueo, la capa interna no necesita volver a adquirir el bloqueo para evitar un punto muerto. ReentrantLock y sincronizado son bloqueos reentrantes. Cerraduras no reentrantes: después de que la capa externa adquiera la cerradura, la capa interna también debe volver a adquirir la cerradura, que es propensa a un punto muerto. Bloqueos justos: aquellos que ingresan al grupo de bloqueo de objetos en diferentes períodos de tiempo adquieren bloqueos de acuerdo con las reglas de bloqueos por orden de llegada. Bloqueos injustos: aquellos que ingresan al grupo de bloqueo de objetos en diferentes períodos de tiempo adquieren bloqueos de acuerdo con las reglas de competir por bloqueos.
Cerraduras sesgadas, cerraduras livianas y cerraduras de peso pesado. Hablen sobre el principio de implementación de Sincronizado. Bloqueo de segmento: habla sobre ConcrrountHashMap. Cerraduras distribuidas: Redis, ZK, etc. Bloqueo de lectura y escritura: no permita otras lecturas y escrituras al escribir, y el servicio no permite una razón al sincronizar con zk.

14. ¿Hablar sobre las tres diferencias entre ReetranLock y Synchronized?

ReentrantLock delega todas las operaciones de la interfaz de bloqueo a la clase Sync. La clase Sync hereda la clase abstracta AQS. Sync tiene dos subclases, una que admite bloqueos justos y
otra que admite bloqueos injustos. El bloqueo injusto se usa por defecto. ReentrantLock.lock llama al método NonFairSync.lock (AQS solo entrega el
método de tratar de adquirir el bloqueo a una subclase para implementar el bloqueo desbloqueo holdLock () para determinar si se adquiere el bloqueo). En general, desbloquear () se escribe en el bloque finalmente para evitar el bloqueo

15. ¿Cuatro diferencias entre ReetranLock y Synchronized?

La primera diferencia: una es una clase, una es una palabra clave, la segunda diferencia: se puede determinar si se adquiere el bloqueo, una no, la tercera diferencia: una es la transmisión automática (especificando la posición inicial y la posición final), una Es un bloque manual (método de decoración y bloque de código)
. La cuarta diferencia: el bloqueo es un bloqueo optimista. Sincronizado originalmente utilizó un bloqueo pesimista. Después de jdk1.6, se vuelve muy poderoso y puede actualizarse.

16. El papel de join ()

Bloqueo de subprocesos, generalmente utilizado para garantizar el orden de ejecución de los subprocesos

17. ¿Cuál es la diferencia entre run () y start ()?

run () es solo un método simple y no crea un hilo, y el método de inicio es ejecutar el método de ejecución después de crear el hilo

18. ¿Cuál es la diferencia entre CycliBarriar y CountdownLatch?

La primera diferencia es que el enfoque es diferente. CycliBarriar se usa generalmente para bloquear un grupo de subprocesos hasta que se ejecute un cierto estado. CountdownLatch es dejar que un subproceso espere a que otros subprocesos
completen la tarea antes de ejecutar. La segunda diferencia es que CycliBarriar puede reciclarse CountdownLatch es de una sola vez, bloqueará el hilo antes de 0

19. ¿Problemas comunes en un entorno de subprocesos múltiples?

Condición de carrera: operar simultáneamente datos que no sean seguros para subprocesos, lo que resulta en resultados inesperados Punto
muerto: tomar recursos unos de otros
Livelock: dejar recursos entre sí, resolver,
hambre por orden de llegada : recursos insuficientes

20. ¿Qué es un átomo?

Por ejemplo, la clase AtomicInteger puede llamar a métodos para aumentar o disminuir para garantizar la seguridad del subproceso

21. ¿Qué es un bloqueo CAS?

CAS tiene 3 operandos, el valor de memoria V, el antiguo valor esperado A y el nuevo valor B a modificar. Si y solo si el valor esperado A y el valor de memoria V son iguales, modifique el valor de memoria V a B, de lo contrario devuelva V.
Se trata de un bloqueo optimista de pensar, creo que antes de que cambie, no hay otros hilos a lo modifican; y sincronizada es un bloqueo pesimista, piensa antes de que cambie, una
habrá otros hilos para modificarlo, el bloqueo pesimista La eficiencia es muy baja.
Hay un problema muy obvio con CAS, es decir, el problema ABA;
si la variable V es A cuando se lee por primera vez, y se verifica que todavía es A cuando se prepara para la asignación, puede indicar que su valor no ha sido modificado por otros hilos. Es?
Si se ha cambiado a B durante este tiempo, y luego se ha vuelto a cambiar a A, la operación de CAS no funcionará correctamente y nunca se ha modificado. En respuesta a esta situación, el paquete concurrente de Java proporciona
una clase de aplicación atómica marcada AtomicStampedRefernce, que puede garantizar la corrección de CAS a través de la versión del valor variable;

22. ¿Cuáles son los bloqueos comunes en la capa de aplicación?

bloqueo sincronizado 、 、

23. ¿Escenarios de aplicación de bloqueo pesimista?

Cuando la cantidad de simultaneidad es alta, se usa un bloqueo optimista si la respuesta es rápida, o tendrá éxito o fallará rápidamente. Si el costo de reintento es alto, use un bloqueo pesimista, que
puede garantizar la tasa de éxito.
El bloqueo pesimista es adecuado para leer menos y escribir más, el bloqueo optimista es adecuado para leer más y escribir menos

24. ¿Qué le sucede al punto muerto IO?

25. ¿Cómo determinar rápidamente si es un problema de punto muerto IO y no otros problemas?

26. ¿CLH lo sabe? Cola virtual

La cola virtual no es una cola real, pero el puntero apunta al siguiente nodo, que parece una cola

27. ¿Por qué las cerraduras de doble verificación necesitan ser volátiles?

28. ¿Por qué el subprocesamiento múltiple puede mejorar la eficiencia?

29. Si abro nuevos hilos indefinidamente, ¿seguirá aumentando la eficiencia de este programa, o disminuirá o permanecerá sin cambios?

30. Sincronizado es un servidor único para tratar problemas de concurrencia, ¿qué pasa con varios servidores?

31. ¿Por qué esperar (), notificar (), notificar a todo () debería llamarse en el bloque de código sincronizado

32. Optimización de sincronizado por máquina virtual java

Sincronizado es un bloqueo pesado antes de 1.6, y el bloqueo sesgado, el bloqueo liviano y el bloqueo de giro adaptativo se introdujeron después de 1.6

33. Cómo compartir datos entre dos hilos

Crear una variable global estática
Pasar referencia por método

34. ¿Cómo usar esperar correctamente? si o mientras?

Debe usar mientras, de lo contrario, esperar por primera vez, después de despertarse, ir directamente al siguiente proceso,
debe juzgar si se cumplen las condiciones antes de que pueda bajar.

35. ¿Por qué usar multihilo? ¿Escenarios de aplicación de subprocesos múltiples?

El subprocesamiento múltiple puede mejorar la utilización de la CPU. Por ejemplo, al enviar un mensaje de texto durante el registro, puede enviar un
mensaje de texto mientras procesa la lógica de negocios. También hay múltiples cargas de archivos y una gran capacidad para escribir registros de forma asincrónica.

36. ¿Cómo detectar un punto muerto?

jstack puede indicar qué lugar está bloqueado, jvm viene con herramientas

37. ¿Cómo asegurar que solo se ejecute un método run () en subprocesos múltiples? (*******)

38. ¿Qué es una cola de bloqueo? ¿Cómo lograrlo?

Problemas de productores y consumidores

39. ¿Qué es ThreadLocal? Cual es el papel? (*******)

40. La diferencia entre síncrono y asíncrono

Sincrónico: todas las operaciones se completan antes de que se devuelvan al usuario, por ejemplo: transferencia bancaria
Asíncrono: no es necesario esperar a que se completen todas las operaciones, luego devolver los resultados para lograr una actualización parcial.

51 artículos originales publicados · Me gusta2 · Visitas 1850

Supongo que te gusta

Origin blog.csdn.net/qq_42972645/article/details/105658158
Recomendado
Clasificación