Il seguente codice Java genera il seguente codice byte JVM.Codice imprevisto nel blocco sincronizzato
Sono curioso perché viene generato il codice dall'offset 31 all'offset 36. Nulla nelle specifiche JLS7 o JVM7 parla di questo. Mi sono perso qualcosa?
Anche se rimuovo le istruzioni println, il codice (offset 31 per offset 36) viene ancora generato, solo in una posizione precedente, poiché la chiamata println è stata rimossa.
// 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
Ciao Peter, la tua risposta non risponde alla domanda: "Sono curioso perché il codice ... viene generato" o addirittura "Mi sono perso qualcosa?". Grazie per la tua partecipazione però. – chuacw
Il codice viene generato perché deve esserci codice per rilasciare il blocco, vedere il mio esempio. Hai perso il mio tentativo di spiegare. ;) –
La spiegazione di Rene è migliore. Inoltre, nota che non ho chiesto un modo alternativo. Grazie comunque. – chuacw