Synchronized是基于操作系统的互斥锁来实现的,但是他会涉及到用户态到内核态的切换,这种切换的代价是很昂贵的,jdk1.6之后做了优化
那它是怎么优化的?
每个对象都有对象头,对象头由MarkWord,指向类的指针,数组的长度组成,它的锁优化依赖于MarkWord中的锁标志位
偏向锁:多数情况下不会出现锁竞争,由一个线程获取锁,然后把这个线程的id放到MarkWord中,第二次还是这个线程进来就不需要进行开锁和加锁,看起来就偏袒了它
轻量级锁:它是偏向锁升级来的,出现了锁竞争,就会升级成轻量级锁,抢到锁的线程进行正常操作,没有抢到的就会进行自旋,尝试获取锁。但是长时间的自旋会空耗cpu,非常消耗性能
重量级锁:当线程竞争比较激烈的时候,线程自旋次数到达10次(默认),就会升级成重量级锁