1. interfaz de bloqueo
La interfaz de bloqueo proporciona algunos métodos, como lock (), tryLock () y otros métodos, como ReentrantLock se basa en el sincronizador de cola para lograr
二 、 AbstractQueuedSynchronizer
1. ¿Qué es un sincronizador de colas?
El sincronizador de cola es una clase abstracta que proporciona una serie de métodos para lograr el estado de sincronización de las colas de subprocesos (la comprensión simple es el bloqueo), incluidos los nodos de cola (es un modelo FIFO, primero en entrar, primero en salir), los atributos del nodo de cola incluyen: encabezado ( Los nodos head, tail, prev y next proporcionan una serie de métodos para adquirir bloqueos, todos estos métodos se escriben a través del giro CAS.
2. Los métodos que el sincronizador de colas necesita reescribir y los métodos ya proporcionados
El método que debe reescribirse es el método al comienzo del intento, que se utiliza para obtener el estado de sincronización, y los métodos proporcionados ejecutarán el método que necesita reescribirse
Los métodos provistos incluyen:
Obtenga el estado de sincronización exclusivamente
Estado de sincronización de lanzamiento exclusivo
Estado de sincronización compartida
Estado de sincronización de lanzamiento compartido
Consultar estado de sincronización
3. Ceremonia de monopolio
Adquirir la cerradura:
Se agrega un nuevo subproceso al nodo de cola, y el criterio de giro CAS de este nodo se establece para determinar si el nodo frontal es el nodo principal e intenta obtener el estado de sincronización. Si el juicio es exitoso y la adquisición es exitosa, el nodo se establece como el nodo principal y se ejecuta, de lo contrario el juicio continúa Juicio de vuelta
Liberar bloqueo
4. Compartido
La diferencia entre compartido y exclusivo es si varios subprocesos pueden obtener el estado de sincronización al mismo tiempo
La adquisición de un bloqueo es similar a la liberación de un bloqueo. Utiliza el giro para determinar si el nodo frontal superior es el nodo principal para intentar obtener el estado de sincronización.
5. Tiempo de espera exclusivo para obtener el estado de sincronización
Se refiere a la adquisición del bloqueo dentro del tiempo especificado y devuelve verdadero si se adquiere; de lo contrario, devuelve falso. Esto no está disponible en sincronizado . Además, la sincronizada interrumpirá ( interrupte ) hilo ha sido bloqueado, y el sincronizador de colas puede volver inmediatamente y lanzar una excepción, Guardar recursos.
La adquisición de la sincronización de estado de tiempo de espera exclusiva y exclusiva de comparación de fase, la primera mitad de la misma, pre-spin se determina si el nodo es el nodo de cabeza, sin embargo, cuando se determina en false, se determina si hay un tiempo de espera y los retornos de la lógica.
Tres, cerradura reentrante ReentrantLock
Caracteristicas
Para el mismo subproceso, el uso múltiple de bloqueos reentrantes para la operación de bloqueo () no provocará el bloqueo del subproceso, este es el nombre del bloqueo reentrante;
Debido a que el bloqueo reentrante puede bloquear el mismo hilo varias veces, hay un recuento del número de bloqueos, y solo después de que se libera el recuento, se considera que el bloqueo reentrante se ha liberado;
Además, las cerraduras reentrantes se dividen en cerraduras justas y cerraduras injustas. Bloqueo justo, al igual que su nombre, qué subproceso adquiere el bloqueo primero y espera el tiempo más largo, luego puede obtener el bloqueo para ejecutarse. No es justo el bloqueo, es decir, no importa qué hilo espere más tiempo, quien agarra el bloqueo primero, quién lo posee, no tiene lógica para juzgar la justicia;
Bloqueo injusto
La implementación predeterminada de bloqueos reentrantes son bloqueos injustos. Los bloqueos injustos intentarán dos bloqueos de bloqueo CAS cada vez que estén bloqueados. Si ambos bloqueos de bloqueo CAS fallan, ingresarán a la cola de sincronización y esperarán.
Bloqueo justo
El bloqueo justo juzgará si el predecesor existe cada vez que intenta agarrar el bloqueo. Si existe, significa que no intentará agarrar el bloqueo después de que esté en la cola.
Resumen de cerraduras injustas y cerraduras justas
Los bloqueos justos solo garantizan las reglas FIFO primero en entrar, primero en salir de la ejecución del hilo, pero no son tan eficientes como los bloqueos injustos, porque los bloqueos injustos no ocupan recursos como los bloqueos justos y determinan si son hilos que pueden obtener bloqueos. Hay mucho menos gastos generales.
4. ReadWriteLock
Caracteristicas
Un bloqueo de lectura y escritura puede permitir que varios subprocesos adquieran el bloqueo de lectura al mismo tiempo, pero se bloqueará al adquirir el bloqueo de escritura. Después de adquirir el bloqueo de escritura, se bloquearán todas las operaciones para adquirir el bloqueo de lectura. El bloqueo de lectura y escritura también tiene las características de bloqueo justo y bloqueo injusto. El bloqueo de lectura-escritura es más adecuado, por ejemplo, para el caché, ya que puede obtener el bloqueo de lectura al mismo tiempo cuando se lee en varios subprocesos, y la operación de escritura necesita obtener el bloqueo de escritura.
Principio
El bloqueo de lectura-escritura solo juzga el estado de lectura-escritura por un valor, que es a través del método de ruptura de 32 bits. Los primeros 16 bits son el estado de bloqueo de lectura, y los últimos 16 bits son el estado de bloqueo de escritura. Al adquirir un bloqueo de lectura, se realiza una operación de bit & utilizando el estado de sincronización y el valor del estado de lectura-escritura, y se utiliza un operador de bit >>> al adquirir un bloqueo de escritura.
Leer bloqueo
Varios hilos pueden adquirir un bloqueo de lectura al mismo tiempo, y si un hilo quiere adquirir un bloqueo de escritura en este momento, se bloqueará
Escribir cerradura
Solo un hilo puede adquirir un bloqueo de escritura, que es un bloqueo exclusivo.