锁的状态
synchronized 在jdk1.6之前是重量级锁,每次都要去和操作系统打交道,而操作系统层面的操作是比较耗性能的,需要将用户态转换为内核态。所以在jdk1.6后就有了锁的升级过程,总共有四种状态:无锁、偏向锁、轻量级锁、重量级锁。从无锁到重量级锁,锁的粒度在不断加大,而且锁的升级过程是不可逆的。
锁的升级过程
无锁
线程执行非同步方法,不加锁,通过不断自旋进行对资源的修改操作,只有一个线程能操作成功。
偏向锁
线程进入同步方法后,对象头 Mark Word会记录当前线程的Id,此后如果还是该线程进入该同步方法,就不需要再进行加锁解锁的过程了,提高了性能。此外,偏向锁不会自己撤销,只有等有线程竞争时,要升级为轻量级锁时,才会撤销。
轻量级锁
线程进入同步方法获取到偏向锁后,此时又有别的线程也要进来,他们通过自旋的方式,来回获取锁然后执行,此时趋于一种相对平稳的状态,就升级为了轻量级锁,他们不会被阻塞,而是通过自旋的方式去不断获取并执行。
重量级锁
有大量的线程此时都要获取锁,由于锁的竞争非常激烈,如果还是不断通过自旋的方式的话,CPU会出现空转的情况,会大量消耗性能,所以轻量级锁就会升级为重量级锁,此时就是操作系统层面来操作了,通过Mutex Lock互斥量,来决定哪个线程获取到锁。
原文链接:https://blog.csdn.net/weixin_51453935/article/details/132133569