El principio de implementación de Sincronizar
La estructura de los objetos Java en la JVM es la siguiente:
Los objetos Java incluyen:
Los objetos están en máquinas de 32/64 bits y cada parte es de 32/64 bits, Class Pointer habilita la compresión del puntero de forma predeterminada en máquinas de 64 bits, ocupando solo 32 bits.
El bloqueo de objetos utiliza el campo Mark Word. El siguiente es el Mark Word de 32 bits.
El proceso de bloqueo de un objeto mediante la palabra clave sincronizar es el siguiente:
La JVM introduce bloqueos sesgados para minimizar las rutas de ejecución de bloqueos livianos innecesarias sin competencia de subprocesos múltiples, porque la adquisición y liberación de bloqueos livianos depende de múltiples instrucciones atómicas CAS, y los bloqueos sesgados solo necesitan reemplazar ThreadID Cuando se basa en una instrucción atómica CAS (Una vez que se produce la competencia de subprocesos múltiples, se debe revocar el bloqueo de sesgo).
Los bloqueos sesgados solo liberarán el bloqueo cuando otros subprocesos intenten competir por el bloqueo sesgado, y el hilo no liberará activamente el bloqueo sesgado. Para cancelar el bloqueo sesgado, debe esperar el punto de seguridad global (no se está ejecutando ningún código de bytes en este momento. Primero pausará el hilo que posee el bloqueo sesgado y determinará si el objeto de bloqueo está en un estado bloqueado). y luego restaurar el bloqueo sesgado al estado anterior después de cancelar el bloqueo sesgado. El estado de bloqueo (el bit de indicador es "01") o bloqueo ligero (el bit de indicador es "00").
El escenario al que se adaptan los bloqueos ligeros es la situación en la que los subprocesos ejecutan alternativamente bloques sincronizados. Si se accede al mismo bloqueo al mismo tiempo, el bloqueo ligero se expandirá hasta convertirse en un bloqueo pesado.
El proceso de implementación de sincronización:
Nota: La función de la instrucción de prefijo de bloqueo: Sincronizar, volátil, CMS todos usan esta implementación
Cuando el bloqueo se expande en un peso pesado Al bloquear, el objeto ObjectMonitor asociado con el objeto de bloqueo actual en la JVM.
La estructura de datos del objeto ObjectMonitor es la siguiente:
EntryList es una lista doblemente enlazada de último en entrar, primero en salir, y AQS (ReentrantLock) es una lista de primero en entrar. lista doblemente enlazada de primero en salir.
Proceso ObjectMoniter:
Nota:
Synchronize tiene solo un WaitSet y AQS puede crear múltiples colas de condiciones (funciones similares a Waitset).
Principio de implementación de sincronizar_flujo técnico-CSDN blog_synchronize