此文乃《Java并发编程的艺术》读书笔记。购买链接
实现的基础
java中的每一个对象都可以作为锁
其表现形式为:
1.对于普通同步方法,锁是当前类的实例对象
2.对于静态同步方法,锁是当前类的Class对象
3.对于同步代码块,锁是synchronized括号里配置的对象
synchronized在JVM的实现
JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。但是两者的实现细节不一样。
代码同步块是使用monitorenter和monitorexit指令来实现的
具体细节如下:
monitorenter指令是在编译后,插入到代码同步块开始的位置,而monitorexit是插入到代码结束处和异常处,JVM要保证每一个monitorenter都有一个与之对应的monitorexit。任何对象都有一个monitor与之关联,当一个monitor被持有后,它就处于被锁定的状态。线程执行到monitorenter指令后,将会尝试获取对象的monitor,如果成功获取,则说明线程持有该对象的锁。
Synchronized的锁是存储在Java对象头里面的
关于Java对象头的详细解释,请看这里这里写链接内容