sincronizada la extensión de bloqueo y jol

jol (java disposición objeto) dependencias necesarias

<dependency> 
            <groupId> org.openjdk.jol </ groupId> 
            <artifactId> jol-core </ artifactId> 
            <versión> 0,10 </ versión> 
        </ dependency>

 

A. procedimiento objeto de bloqueo sincronizado actualización (expansión), principalmente como sigue:

1. proceso de expansión: (inicialización del objeto de bloqueo) sin bloqueo -> bloqueo sesgada (con solicitud de seguro de rosca) -> cerraduras ligero (multiproceso competencia leve) -> cerraduras de peso pesado (o demasiado largo hilo operaciones que consumen , hilo de giro de CPU consumo excesivo);

2.jvm 4s de retardo predeterminado se convierten automáticamente hacia cerradura (en este caso, anónimo sesgada de bloqueo, no apunta a la rosca de tareas), por -XX: BiasedLockingStartUpDelay = 0 Cancelar retardo, si no sesgado de bloqueo, por -XX: -UseBiasedLocking = conjunto falsa

3. El bloqueo sólo se puede actualizar, no degradar; sesgada pestillo puede ser de reposición al estado bloqueado sin

4. La grabación de información objeto de bloqueo rosca de la cabeza que tiene el bloqueo, pero no pueden liberar activo, mientras que el uso de un bloqueo de rosca de pila de grabación de información, cuando la otra solicitud (T1) ha sido ocupado por un bloqueo de rosca, la cerradura de acuerdo con la primera información, para encontrar correspondiente a una pila de subprocesos, si el hilo se ha completado, el bloqueo del objeto se establece en el primer estado no bloqueo, entonces ocupada T1 está sesgada bloqueo roscado puesto; si la posición final de la rosca, el estado de bloqueo por la extensión de bloqueo está sesgada bloqueo ligero.

5. sesgado bloqueo bloqueo del modo de mantenimiento de peso ligero y fácil, bloquee necesidad de peso para cambiar a un modo de núcleo (OS) se mantiene;

II. cabecera del objeto de bloqueo (porción markword 8 bytes) usando diferentes, representan un estado, la máquina virtual 64 markword sigue:

Utilice jol presentación de la siguiente manera:

1. estado libre de bloqueo

Objeto Object = nuevo Object (); 
        System.out.println ( "hash de:" + Object.hashCode ()); 
        System.out.println (ClassLayout.parseInstance (objeto) .toPrintable ());

Los primeros 8 bytes de la cabecera de alto a bajo de acuerdo con el hábito usual para mostrar: 00000000 00000000 0,000,000,000,111,001 1,010,111,011,101,101 0,010,111,100,000,001

La figura controla los tres últimos bits son 001, estado no bloqueado, el intermedio 31 (0.111.001 10.101.110 1,110,110,100,101,111) que se convierte en la figura decimal de hash impreso en: 967 765 295

2. Anonymous sesgada de bloqueo y bloqueo sesgada

Thread.sleep (5000); // 等待JVM开启偏向锁 
        Object o = nuevo Object (); 
        System.out.println (ClassLayout.parseInstance (o) .toPrintable ()); 

        sincronizado (o) { 
            System.out.println (ClassLayout.parseInstance (o) .toPrintable ()); 
        }

La primera impresión sesgada anónima, sesgado punto de bloqueo para el segundo hilo principal

Nota: El programa se inicia con la carrera, no utilice depuración, prueba del tiempo, con el inicio de depuración, la segunda impresión actualizar directamente bloqueo ligero.

3. bloqueo Ligera

 

pública  estática  vacíos principales (args String []) lanza InterruptedException { 
        Thread.sleep ( 5000 ); 
        Object o = nuevo Object ();
        sincronizado (o) { 
            System.out.println (ClassLayout.parseInstance (o) .toPrintable ()); 
        } 
        Para ( int i = 0; i <1; i ++ ) { 
            Thread t = nueva rosca (() -> { 
                print (o); 
            }); 
            t.Start (); 
        } 
    } 

    Pública  estática vacío de impresión (Object) {
         sincronizada (o) { 
            System.out.println (ClassLayout.parseInstance (o) .toPrintable ()); 
        } 
    }

 

4. Bloqueo de peso pesado

 

pública  estáticas  vacíos principales (args String []) { 
        Object o = nueva Object ();
        para ( int i = 0; i <2; i ++ ) { 
            Thread t = nueva rosca (() -> { 
                print (o); 
            }); 
            t.Start (); 
        } 
    } 

    Pública  estática  vacío de impresión (Object o) {
         sincronizada (o) { 
            System.out.println (ClassLayout.parseInstance (o) .toPrintable ()); 
        } 
    }

 

 

referencia:

https://www.ixigua.com/i6807658279146095115/

https://blog.csdn.net/tongdanping/article/details/79647337

 

Supongo que te gusta

Origin www.cnblogs.com/katsu2017/p/12610002.html
Recomendado
Clasificación