Open cczuwangkun opened 5 years ago
对于同步代码块来说通过反编译产生的结果和作者的一致,monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置!
但是对于同步方法来说就不是通过monitor,写一个同步方法通过反编译可以看出 0: aload_0 1: invokevirtual #5 // Method method:()V 4: goto 0 他是通过invokevirtual 指令, 在VM字节码层面并没有任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的accessflags字段中的synchronized标志位置1,表示该方法是同步方法并使用调用该方法的对象或该方法所属的Class在JVM的内部对象表示Klass做为锁对象。
是这样子的,在Java并发编程这本书里,讲到synchronized同步代码块,是使用 monitor 监视器来实现的;同步方法的话,该书也没有具体的说。
对于同步代码块来说通过反编译产生的结果和作者的一致,monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置!
但是对于同步方法来说就不是通过monitor,写一个同步方法通过反编译可以看出 0: aload_0 1: invokevirtual #5 // Method method:()V 4: goto 0 他是通过invokevirtual 指令, 在VM字节码层面并没有任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的accessflags字段中的synchronized标志位置1,表示该方法是同步方法并使用调用该方法的对象或该方法所属的Class在JVM的内部对象表示Klass做为锁对象。