Preguntas de la entrevista de bloqueo de Java (ReentrantLock, sincronizado)





1. bloquear

Herramientas de uso común relacionadas con bloqueos y seguridad de subprocesos: sincronizado, ReentrantLock, AtomicInteger, AtomicLong, CopyOnWriteArrayList, CopyOnWriteArraySet, ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet

2. Bloqueo de reentrada

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-gkCZHf8l-1685216539209) (…/images/imagehello.png)]

2.1 El principio de realización de ReentrantLock

ReentrantLock se implementa en base a AQS (AbstractQueuedSynchronizer). AQS es un marco para construir bloqueos y sincronizadores. AQS se puede usar para construir de manera fácil y eficiente una gran cantidad de sincronizadores ampliamente utilizados, como ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock, ThreadPoolExecutor. , etc.

2.2 ¿Qué es AQS?

AQS mantiene internamente un estado int volátil y una cola FIFO. El estado se usa para representar el estado de sincronización, y la cola FIFO se usa para almacenar subprocesos que no logran obtener el estado de sincronización.

2.3 ¿Qué es CAS?

CAS (Comparar e intercambiar) es un algoritmo sin bloqueo. Cuando varios subprocesos intentan usar CAS para actualizar la misma variable al mismo tiempo, solo uno de los subprocesos puede actualizar el valor de la variable, mientras que otros fallan y el el hilo fallido no se eliminará En lugar de colgar, se le dice que falló en esta competencia y puede intentarlo nuevamente.

3. sincronizado

3.1 El principio de realización de sincronización

Implementado por monitores de objetos en Java. Cada objeto tiene un monitor, y el monitor se puede asociar con cualquier cantidad de subprocesos. El subproceso puede interactuar con el monitor llamando a los métodos de espera() y notificación() del objeto.

El subproceso ejecuta wait(): se permitirá ingresar a la cola de espera del monitor y liberará todos los bloqueos en el monitor.

El subproceso ejecuta notificar (): seleccionará aleatoriamente un subproceso de la cola de espera y lo despertará. El subproceso despertado ingresa a la cola de bloqueo del monitor y espera para adquirir el bloqueo en el monitor. Cuando el subproceso termina de ejecutarse y sale del bloque de código sincronizado, se liberarán todos los bloqueos en el monitor. En este momento, el subproceso despierto puede adquirir los bloqueos en el monitor y continuar ejecutándose.

3.2 Proceso de actualización de bloqueo sincronizado

[La transferencia de la imagen del enlace externo falló, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-1amvKo6G-1685216539210) (.../images/image-111.png) ] El proceso de actualización de bloqueo sincronizado se divide en
cuatro Hay tres etapas: sin bloqueo, bloqueo parcial, bloqueo ligero y bloqueo pesado.

Describa brevemente el proceso de actualización:
sin bloqueo

Bloqueo sesgado: cuando un subproceso accede al bloque de sincronización y adquiere el bloqueo, si el bloque de sincronización no está bloqueado, el subproceso intentará obtener el bloqueo sesgado del bloque de sincronización y establecerá la marca. en el encabezado del objeto, Word se establece en un bloqueo sesgado. Si el bloque sincronizado ya está bloqueado por otro subproceso, el subproceso intentará adquirir el bloqueo ligero del bloque sincronizado.

Bloqueo ligero: cuando un subproceso intenta adquirir el bloqueo de un bloque de sincronización, si el bloque de sincronización no está bloqueado, entonces el subproceso intentará adquirir el bloqueo ligero del bloque de sincronización y establecerá Mark Word en el encabezado del objeto en is un puntero al marco de pila del subproceso. Si el bloque de sincronización ya está bloqueado por otros subprocesos, el subproceso intentará adquirir el bloqueo pesado del bloque de sincronización.

Bloqueo pesado: cuando un subproceso intenta adquirir el bloqueo de un bloque de sincronización, si el bloque de sincronización ha sido bloqueado por otros subprocesos, el subproceso entrará en estado bloqueado hasta que se libere el bloqueo del bloque de sincronización. En la implementación de bloqueos pesados, la JVM apuntará la palabra de marca del objeto a un mutex, para realizar el bloqueo y el despertar de los hilos.

3.2.1 Sin bloqueo

En el estado sin bloqueo, los subprocesos pueden ingresar a la sección crítica a voluntad sin ninguna operación de sincronización.

3.2.2 Bloqueo de polarización

Bloqueo sesgado (solo se usa en escenarios sin competencia), si una escena adquiere un bloqueo, el subproceso puede adquirir el bloqueo aquí en el futuro, y la JVM favorecerá este subproceso.

3.2.3 Cerraduras ligeras

Bloqueos ligeros (solo se usan en escenarios sin competencia), si una escena adquiere un bloqueo, el subproceso puede adquirir el bloqueo aquí en el futuro, y la JVM favorecerá este subproceso.

3.2.4 Cerraduras pesadas

Bloqueos pesados ​​(solo se usan en escenarios con competencia), si una escena adquiere un bloqueo, el subproceso puede adquirir el bloqueo aquí en el futuro y la JVM favorecerá este subproceso.

3.2.5 Bloqueos giratorios

Un bloqueo giratorio significa que cuando un subproceso intenta adquirir un bloqueo, si el bloqueo ya está ocupado por otros subprocesos, esperará en un bucle hasta que se libere el bloqueo. El subproceso no se suspenderá, sino que estará en una espera ocupada. Por lo tanto, las cerraduras giratorias son generalmente adecuadas para situaciones en las que la sección crítica protegida por la cerradura es relativamente pequeña.

3.2 La diferencia entre sincronizado y volátil

sincronizado se usa para garantizar que solo un subproceso pueda acceder al código modificado por sincronizado a la vez, mientras que volátil se usa para garantizar la visibilidad de las variables entre varios subprocesos.

4. La diferencia entre sincronizado y ReentrantLock

  1. sincronizado es una palabra clave de Java, ReentrantLock es una clase
  2. Comparado con sincronizado, ReentrantLock proporciona algunas funciones avanzadas, principalmente los siguientes tres elementos:
    1. La espera puede ser interrumpida.Cuando el subproceso que mantiene el bloqueo no se libera durante mucho tiempo, el subproceso en espera puede optar por dejar de esperar, lo que equivale a evitar el punto muerto en términos de sincronización.
    2. Bloqueo justo. Cuando varios subprocesos están esperando el mismo bloqueo, deben adquirir el bloqueo en el orden en que lo solicitaron. Los bloqueos sincronizados son bloqueos injustos. El constructor predeterminado de ReentrantLock es un bloqueo injusto creado al pasar true to crear un bloqueo justo.
    3. El bloqueo está vinculado a varias condiciones y un objeto ReentrantLock puede vincular varios objetos de condición al mismo tiempo.
  3. Sincronizado liberará automáticamente el bloqueo. ReentrantLock necesita liberar el bloqueo manualmente. Si el bloqueo no se libera, puede causar interbloqueo

4.1 ¿Qué es una cerradura reentrante?

Un bloqueo reentrante significa que el mismo subproceso puede adquirir el mismo bloqueo varias veces sin bloquearse. Tanto ReentrantLock como sincronizado son bloqueos de reentrada.

4.2 ¿Qué son los bloqueos optimistas y los bloqueos pesimistas? (breve respuesta)

Hay muchos conceptos y métodos de implementación específicos.
El bloqueo optimista cree que los datos generalmente no causan conflictos, por lo que no se bloquearán, mientras que el bloqueo pesimista cree que los datos generalmente causan conflictos, por lo que se bloquearán.

4.3 ¿Qué es un bloqueo giratorio? (breve respuesta)

Spin lock significa que el subproceso que intenta adquirir el bloqueo no se bloqueará inmediatamente, sino que intentará adquirir el bloqueo de manera cíclica. La ventaja de esto es reducir el consumo de cambio de contexto del subproceso. La desventaja es que el bucle consumir CPU.

4.4 ¿Qué son los bloqueos justos y los bloqueos injustos? (breve respuesta)

El bloqueo justo significa que varios subprocesos adquieren bloqueos en el orden en que los solicitan. Los bloqueos no justos no son secuenciales. La ventaja de los bloqueos no justos es que el rendimiento es mayor que el de los bloqueos justos.

4.5 ¿Qué es un punto muerto? Cómo evitarlo (breve respuesta)

Deadlock se refiere a un fenómeno en el que dos o más hilos esperan el uno al otro debido a la competencia por los recursos durante la ejecución, si no hay una fuerza externa, estos hilos no podrán avanzar.
Formas de evitar el punto muerto:

  1. establecer tiempo de espera
  2. Detección de interbloqueo tryLock
    , etc.






Mi dirección de Github , bienvenidos a todos a unirse a mi proyecto de código abierto, o (contácteme en mi página de inicio) para unirse a su proyecto de código abierto, haga clic en Github-Stars.

\ nombre del proyecto de código abierto tipo dependiente número de versión describir
1 resorte-bota-arranque-trie pompón 1.0.0-INSTANTÁNEA La velocidad de consulta bajo requisitos específicos supera con creces la de las herramientas de búsqueda de código abierto, y el árbol B+ en innodb o el índice invertido en ES no se pueden comparar con él.
2 resorte-bota-arranque-trie frasco 1.0.0-M1 Proporciona nodos de servicio basados ​​en SpringCloud, que se pueden usar para el descubrimiento de servicios a través del registro de Nacos, realizando una expansión y contracción dinámicas del árbol y servicios dinámicos en línea y fuera de línea.
3 Proveedor de datos pompón 1.0.0-INSTANTÁNEA Proporciona consultas de múltiples fuentes de datos y sincronización de tipos de datos.Como Jar, puede confiar en proporcionar datos de forma dinámica en otros servicios.

Supongo que te gusta

Origin blog.csdn.net/jj89929665/article/details/130908758
Recomendado
Clasificación