在代码块中,如果使用的syunchronized关键字的话,那么他的字节码文件中就会有两个指令: monitorenter(监视器输入)和monitorexit(监视器退出);
monitorenter:每一个对象都有一个监视器锁(monitor),当monitor锁被占用时,对象就会处于锁定状态,线程执行monitorenter 指令就是尝试获取monitor的所有权。
三种情况:
当monitor的进入数为 0 时, 该线程进入monitor,并设置进入数为 1 ,该线程就是monitor的所有者
如果该线程为monitor的所有者,只是重新进入,则进入monitor的进入数加 1
如果monitor被其他线程占用了,该线程进入阻塞状态,直到monitor进入数为 0 时,该线程在重新尝试获取monitor的所有权
monitor exit(监视器退出): 执行该指令的线程必须是object ref 所对应的monitor的所有者,
monitor exit 指令执行时,monitor的进入数减一,如果monitor的进入数为 0 时,那么该线程退出monitor,其他被monitor阻塞的线程尝试获取monitor

一个monitorenter对应一个montorenter。 但在字节码中有两个monitorexit ,这是因为如果在执行同步锁的同时出现了异常的话,就会跳过第一个monitorexit (释放锁),为了保证锁的释放就会执行第二个monitorexit 。
网友评论