一、java对象头
- 锁的获取和撤销会关系到对象头,所以先来看看对象头。
- Java对象头Mark Word字段存放内容:
- 根据竞争状态的激烈程度,锁会自动进行升级,锁不能降级(为了提高锁获取)
一、偏向锁
- 由于老版本的内建锁synchronized存在最大的问题:在存在线程竞争的情况下会出现线程的阻塞以及唤醒带来的性能问题,这是一种互斥同步(阻塞同步)。
- 大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得。为了让线程获取锁的开销降低引入偏向锁。
- JDK1.6之后引入了偏向锁的概念,偏向锁是一种乐观锁(假设所有线程访问共享资源时不会出现冲突)。
1.偏向锁的获取
- 1.因为锁标志位为01的时候会存储线程ID,当一个线程进入同步代码块的时候判断对象头里的Mark Word是否存储着指向当前线程ID,如果有就让当前线程获得锁。(这里可以解释,当同一个线程不断重入偏向锁的时候不需要进行CAS操作,只需要进行一个判断就可以获得锁)最后执行步骤5。如果没有,则进行步骤2的判断。
- 2.判断Mark Word中偏向锁标识是否设置为1(表示当前是偏向锁), 如果是的话指向步骤3 ,否则执行步骤4
- 3.尝试使用CAS将对象头的偏向锁指向当前线程, 成功表示获取偏向锁成功, 则执行步骤5, 失败则表示存在竞争, 偏向锁