JAVA中synchronized锁升级及4种状态
锁可以升级,但不能降级。即:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的
32位的jvm里面对象头示例
无锁 :biased_lock(0),01。这个时候的biased_lock 是0的时候就表示了现在无偏向
偏向锁:biased_lock设成1代表该对象锁成为了偏向锁,并且在原来存hashcode的地方将偏向的线程记录了,这个时候调用对象的hashcode()方法会使偏向锁生效
轻量级锁 :当一个线程尝试获取一个对象的锁时,如果发现该对象处于偏向锁状态,但是不是自己持有偏向锁,那么就需要升级为轻量级锁。轻量级锁的实现通常也会使用CAS操作来尝试获取锁,这个时候会通过替换锁对象头的引用来确定,如果当前锁对象头不是锁对象本身的地址那么就证明在同一时间发生了竞争,竞争情况下可能膨胀为重量级锁。00(指轻量级锁状态)
重量级锁:升级后前面持有锁的线程在还回去的时候发现了还不回去锁对象已经创建了Monitor,这个时候线程就需要将owner置为null,然后唤醒阻塞中的线程。10(指重量级锁状态)
重量级锁也有优化,在重量级锁的情况下线程在没有获取到锁的情况下不会立即阻塞,阻塞是需要切换上下文的是需要耗费资源的,线程会进行一个自旋操作继续获取锁万一锁释放了呢(自旋耗费CPU性能,单核CPU自旋就是浪费),jvm会根据前面自旋成功的情况给我们智能的调节自旋的次数。