锁的等级: 无锁态(new) - 偏向锁 - 轻量级锁 (无锁,自旋锁,自适应自选) - 重量级锁
synchronized
一般为轻量级锁,synchronized
锁的是变量,而不是代码。
若要锁定一个变量,则需要向操作系统”申请”一把锁,而synchronized
为了节约资源,第一个访问变量的线程不会立即去申请,而是添加一个标签,即偏向锁。
当有另外一个线程发生”竞争”时,将自动升级为轻量级锁。
首先撤销偏向锁的状态,并在各自的线程创建一个LockRecord
对象,锁则指向线程栈中某一个LockRecord
的指针(每个线程不断地尝试CAS这个指针,直至修改成功)。
轻量级锁不需要内核态的权限,而是以用户态执行的,可以理解为一个whlie不断地循环。
在轻量级锁中,若某一个线程占用锁的时间过长,则会导致其它线程不断的”自旋”,非常地消耗性能!
在默认情况下,若有线程超过10次自旋或自旋线程数超过CPU核数的一般,则升级为重量级锁。
升级重量级锁:向操作系统申请资源,CPU从3级-0级系统调用,线程挂起,进入等待队列,等待操作系统的调度