同步代码块原理。指代Synchronized重量级锁的加锁过程
1、同步代码块被编译后,开始和结束地方都增加了两条指令。分为被MonitorEnter和MonitorExit。
2、对象头的MarkWord中,可记录锁标志位和重量级锁(ObjectMonitor对象)的指针
3、ObjectMonitor和锁对象的关系,一对一,随着锁对象的创建和消亡而存在和消失,也可以当线程尝试获取锁对象时而建立。
4、ObjectMonitor对象的数据结构中有锁计数器,waitSet(wait方法释放了锁而休眠的线程)和EntrySet队列(在外面等待竞争锁的线程)
5、线程检查锁对象,当时无锁状态时,建立ObjectMonitor监视器锁对象,锁计数器加1,并将监视器锁对象地址写入锁对象的Markword中。完成加重量级锁。
6、其他线程来时,检查锁计数器是否为0,如果不为零,则进入EntrySet等待竞争锁。
7、锁释放。线程执行结束,释放锁,并将锁计数器清零。