synchronized_0">介绍synchronized关键字的底层之前,先要了解对象在内存中存储的布局。
因此Java识别对象是否存在锁是在虚拟机中通过对象头中的锁标志来判断的,因此从对象头中的指向重量级锁的指针开始认识synchronized的底层实现。
对于synchronized的对象锁,指针是指向的一个monitor对象的起始地址,每一个对象实例都会有一个monitor。monitor是跟随对象创建以及销毁的,同时线程在获取对象锁的时候也可以自动生成。
synchronized_13">对于synchronized修饰代码块
根据虚拟机规范要求,在执行monitorenter指令时,首先要尝试获取对象锁,也就是上文我们提到了monitor对象。如果这个对象没有被锁定,或者当前线程已经拥有了这个对象的锁,那么就把锁的计数器(_count)加1。当然与之对应执行monitorexit指令时,锁的计数器(_count)也会减1。
synchronized_18">对于synchronized修饰方法
当synchronized修饰方法时,不是通过monitor对象来进行锁的判断的,在修饰方法是通过ACC_SYNCHRONIZED标识,Java虚拟机通过验证ACC_SYNCHRONIZED标识来判断是否是一个需要同步的方法。