El siguiente código Java genera el siguiente código de byte JVM.Código inesperado en el bloque sincronizado
Tengo curiosidad de por qué se genera el código del desplazamiento 31 al desplazamiento 36. Nada en la especificación JLS7 o JVM7 habla de esto. ¿Yo me perdí algo?
Incluso si elimino las instrucciones println, el código (offset 31 a offset 36) aún se genera, solo en una ubicación anterior, ya que se ha eliminado la llamada println.
// Java code
void testMonitor() {
Boolean x = new Boolean(false);
synchronized(x) {
System.out.println("inside synchronized");
System.out.println("blah");
};
System.out.println("done");
}
// JVM bytecode
Offset Instruction Comments (Method: testMonitor)
0 new 42 (java.lang.Boolean)
3 dup
4 iconst_0
5 invokespecial 44 (java.lang.Boolean.<init>)
8 astore_1 (java.lang.Boolean x)
9 aload_1 (java.lang.Boolean x)
10 dup
11 astore_2
12 monitorenter
13 getstatic 15 (java.lang.System.out)
16 ldc 47 (inside synchronized)
18 invokevirtual 23 (java.io.PrintStream.println)
21 getstatic 15 (java.lang.System.out)
24 ldc 49 (blah)
26 invokevirtual 23 (java.io.PrintStream.println)
29 aload_2
30 monitorexit
31 goto 37
34 aload_2
35 monitorexit
36 athrow
37 getstatic 15 (java.lang.System.out)
40 ldc 51 (done)
42 invokevirtual 23 (java.io.PrintStream.println)
45 return
Hola Peter, tu respuesta no responde a la pregunta: "Tengo curiosidad por saber por qué se genera el código ..." o incluso "¿Extrañé algo?". Gracias por su participación. – chuacw
El código se genera porque tiene que haber código para liberar el bloqueo, ver mi ejemplo. Te perdiste mi intento de explicar. ;) –
La explicación de Rene es mejor. Además, tenga en cuenta que no pedí una forma alternativa. Gracias de cualquier manera. – chuacw