Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo lograr la sincronización en la parte inferior? ¿Cómo se implementan las actualizaciones y degradaciones de bloqueo?

¿Cómo lograr la sincronización en la parte inferior? ¿Cómo se implementan las actualizaciones y degradaciones de bloqueo?

¿Cómo implementar la sincronización subyacente? ¿Qué es la actualización y degradación de bloqueo?

El sistema operativo se divide en modo de usuario y modo de kernel. Los programas a nivel de aplicación se ejecutarán en modo de usuario y no podrán acceder al hardware, mientras que los programas del kernel del sistema operativo se ejecutarán en modo de kernel y podrán acceder directamente al hardware. El bloqueo de sincronización es un bloqueo pesado que se ejecuta en una máquina virtual. La máquina virtual es un programa a nivel de aplicación que se ejecuta en modo de usuario. Necesita aplicarse al programa del núcleo del sistema operativo y obtener comentarios para obtener el bloqueo. Bloqueo de sincronización. También un bloqueo pesado. Las cerraduras CAS funcionan directamente en modo de usuario, por eso se denominan cerraduras ligeras.

CAS, conocido como spin lock o lockless, es un candado liviano que puede usarse como reemplazo de los bloqueos de sincronización. Sin embargo, si un hilo está comparando el mismo valor, es posible que otro hilo modifique el valor antes de modificar el valor actual. ¿Cómo evitar esta situación? Como se muestra a continuación:

En el método nativo compareAndSwap escrito en C++, si hay varios subprocesos, hay un bloqueo de instrucción cmpxchg para garantizar la seguridad del subproceso. Cuando hay varias CPU en la parte inferior que apuntan a la misma declaración (CAS), varias CPU se conectan a la declaración a través del bus. Después del bloqueo, el bus se acelerará y no se volverá a conectar hasta que la CPU se conecte a la misma. La declaración completa la ejecución, permitiendo que otras CPU operen esta declaración.

La información del bloqueo sincronizado se registra en los primeros cuatro bytes de la palabra de marca.

Las cerraduras ligeras también se llaman cerraduras giratorias. A excepción de las cerraduras pesadas, todas las cerraduras se completan en modo de usuario.

La actualización de cerradura se refiere a actualizar una cerradura liviana a una cerradura pesada.

¿Por qué los bloqueos de giro pueden lograr seguridad de múltiples subprocesos? ¿Por qué se actualizan a bloqueos pesados ​​​​en una competencia feroz? Porque estos subprocesos de bloqueos de giro siempre están en el bucle while, lo que consume recursos de la CPU y los bloqueos pesados ​​​​son estos subprocesos. están en cola y no consumen recursos de CPU. Se pueden dividir en bloqueos justos y bloqueos injustos.

El bloqueo sesgado está habilitado de forma predeterminada, pero con un retraso de 4 segundos.

Por qué hay un retraso de 4 segundos al iniciar el bloqueo de polarización: porque iniciar el bloqueo de polarización no necesariamente mejora la eficiencia. Si sabe desde el principio que habrá muchos subprocesos compitiendo por el bloqueo, entonces no es necesario activar el bloqueo de polarización, lo que mejora la eficiencia.

La implementación subyacente de Synchronized:

Synchronized es uno de los métodos más utilizados para resolver problemas de concurrencia en Java, y también es uno de los métodos más simples.

Synchronized hace tres cosas:

Sintácticamente, Synchronized puede tratar cualquier objeto no nulo como un "objeto no nulo". Synchronized puede utilizar cualquier objeto no nulo como "bloqueo". En la implementación de HotSpot JVM, los bloqueos tienen un nombre especial: monitores de objetos.

Sincronizado generalmente tiene tres usos:

Tenga en cuenta que el bloqueo integrado sincronizado es un bloqueo de objeto (bloquea el objeto, no la variable de referencia). el objeto, que se puede utilizar para sincronizar la clave, tiene acceso mutuamente exclusivo a los recursos y es reentrante. La función más importante de la reentrada es evitar puntos muertos, por ejemplo:

Cuando un método de sincronización de subclase llama a un método de sincronización de clase principal, si no hay una función de reentrada, se producirá un punto muerto

monitorenter: Cada objeto es un bloqueo de monitor.

Cuando el monitor está ocupado, está en un estado bloqueado y el hilo ejecuta la instrucción monitorenter para intentar obtener la propiedad del monitor, de la siguiente manera:

(1). es 0, el hilo ingresa al monitor Después de establecer el número de entrada en 1, el hilo es el propietario del monitor

(2) Si el hilo ya ocupa el monitor y simplemente ingresa nuevamente, la entrada. el número de entradas al monitor aumenta en 1;

(3) Si otro subproceso ya ocupa el monitor, el subproceso ingresa al estado de bloqueo hasta que el número de entradas en el monitor sea 0 y luego intenta ocuparlo. el monitor nuevamente;

monitorexit: El hilo que ejecuta monitorexit debe ser el propietario del monitor correspondiente a objectref. Cuando se ejecuta esta instrucción, el recuento de entradas del monitor se reduce en 1. Si el recuento de entradas es 0 después de restar 1, el subproceso sale del monitor y ya no es propietario del monitor. Otros hilos bloqueados por el monitor pueden intentar tomar posesión del monitor.

La instrucción monitorexit aparece dos veces. La primera vez es para liberar el bloqueo como una salida normal sincrónica y la segunda es para liberar el bloqueo como una salida asincrónica.

A través de los dos párrafos de descripción anteriores, deberíamos poder ver claramente el principio de implementación de la sincronización. Para completar el objeto de monitor, en realidad esperar/notificar y otros métodos también dependen del objeto de monitor, es por eso que solo puede llamar a esperar/notificar y otros métodos en bloques de código o métodos sincronizados; de lo contrario, se generará una excepción java.lang .IllegalMonitorStateException.