synchronized本质是获取一个独占可重入的对象。java对象由三部分组成:对象头,实例数据,对齐填充。 其中对象头记录了这个对象所指向的C++monitor对象,这个monitor记录了哪个线程持有锁,以及一些阻塞队列等。
也就是说如果 synchronized(lock) lock对象的对象头有个指针 指向了 monitor,这个是一一对应的关系。
synchronized底层指令是1个monitorenter和2个monitorexit。 是因为除了正常退出,还有出现异常也要退出,所以有2个退出指令。
synchronized在1.6之前是重量级锁,此后便优化成3个级别,偏向锁,轻量级锁,重量级锁,可以看我这篇文章 锁的升级