偏向锁:
部分情况下,锁不仅不存在竞争,而且总是由一个线程多次获得, 为了让获取锁的代价更低,就有了偏向锁。 当一个线程使用synchronized方式获取了一个锁对象时,会在该对象的对象头中存储当前线程的ID,后续这个线程再次去获取该锁对象时,直接进行线程ID的比较,成功就表示该锁是偏向当前线程的,不需要再次获取锁了。
大端小端存储:计算机存储一般是小端
大端:低地址存放高位字节,高地址存放低位字节
小端:低地址存放低位字节,高地址存放高位字节
例:0x12345678存放进下面地址:
小端 大端
4000 0x78 0x12
4001 0x56 0x34
4002 0x34 0x56
4003 0x12 0x78
无锁(无锁可偏向,无锁不可偏向)、轻量级锁、重量级锁
没有开启偏向锁的情况下:
一个对象没有被作为锁对象,处于无锁状态
一个对象被一个线程获取作为锁对象,处于轻量级锁状态
一个线程已经持有了该锁对象,其他线程来争用,处于重量级锁状态。
开启偏向锁的情况下:
(修改偏向锁的延迟时间的参数:-XX:BiasedLockingStartupDelay=0)
一个对象没有被作为锁对象,处于无锁可偏向状态。(对象头中没有记录线程ID)
一个对象被一个线程作为锁对象,处于无锁可偏向锁状态。(对象头中记录了线程ID)
一个对象被一个线程作为锁对象,释放锁对象后(但是该线程没有消亡时,如果消亡则是无锁可偏向状态),其他线程再获取该锁对象,则处于轻量级锁状态。
一个对象被一个线程作为锁对象,没有释放锁,其他线程也要获取该锁对象,就处于重量级锁状态。