一、线程安全和对象头Mark
每个对象都有一个对象头标记Mark(32位)
Mark描述对象hash、锁信息、垃圾回收标记、年龄
二、锁的分类
偏向锁:(只在单线程有效)
--------- 偏心锁,锁会偏向让当前已经持有锁的线程持有
--------- Mark中:标记为偏向,写入线程ID
--------- 只要没有竞争,获得偏向锁的线程将来进入同步块不需要同步(提高性能)
--------- 其它线程请求相同锁时(产生竞争),偏向模式结束
--------- 启用偏向锁: -XX:+UseBiasedLocking(默认启用)
轻量级锁
-------- BasicObjectLock(嵌入在栈中的对象):Mark对象头+锁指针
-------- 性能高,快速锁定
-------- 没有竞争时,使用轻量级锁。有竞争时(性能下降),升级为重量级锁。
自旋锁
-------- 竞争存在时,如果某个线程获取了锁,就让线程做几个空操作(自旋)
-------- JDK 1.7以上内