1.idea查看字节码jclasslib插件安装2.从字节码的角度分析synchronized实现3.总结1.idea查看字节码jclasslib插件安装synchronize这个关键字大家一定不陌生。下面我们从字节码的角度来分析一下,为什么会有加锁的作用。我们先安装jclasslib插件,这样我们就可以查看java的字节码了。点击view-->showBytecodeWithJclasslib可以看到这个文件的字节码。2、从字节码的角度分析synchronized的实现2.1synchronized同步代码块publicclassLockByteDemo{finalObjectobject=newObject();publicvoidm1(){synchronized(object){System.out.println("------------hellosync");//抛出新的RuntimeException("6");}}}让我们检查一下synchronized同步代码块方法m1()的字节码。我们发现它使用了monitorenter命令和monitorexit命令。monitor:其实每个对象都有一个monitor,也就是监视器。当线程成功获取监视器时,对象被锁定。monitorenter命令:线程执行monitorenter尝试获取monitor的归属,过程为:1)如果某个monitor的值为0,则线程直接进入monitor,并设置monitor为1,并设置线程对象抢占线程。2)如果线程已经占用了monitor,直接进入,monitornumber+1(可重入锁)3)如果对象的抢占线程不是线程,那么线程会一直阻塞,直到monitor的值变为0,再次抢占。monitorexit命令:执行monitorexit的线程必须是已经拥有对象monitor的线程。执行monitorexit命令后,monitorentry的个数会减1,当减为0时,其他线程可以尝试获取monitor的所有权。但是这里有个问题,为什么只有一个monitorenter,而有两个monitorexit呢?我们可以想一想,这其实和try/finally是一样的。我们一般编程的时候,一定要在finally里面加一个unlock,防止出现异常情况。这里也是一样,为了防止出现异常代码,最后监听退出。**2.2synchronized普通同步方法我们会发现普通方法标志多了一个ACC_SYNCHRONIZED访问标志。当我们调用一个方法时,我们首先会检查该方法的ACC_SYNCHRONIZED访问标志是否被设置。如果设置了,线程执行会先尝试获取monitor,最后在方法完成时释放monitor。2.3synchronized静态同步方式静态同步方式的原理是一样的,只是多了一个ACC_STATIC标志来区分是不是静态同步方式。3.总结今天我们分析了synchronized的字节码实现。其实增加内功的修炼,会让我在写代码的时候有不一样的感受。之前写synchronized的时候,脑子里只有一个。synchronized关键字现在和字节码相关联,可能就是古人所说的,从看山是山到看山不是山。
