偏向锁
偏向锁就是一旦线程第一次获得了监视对象,之后让监视对象"偏向"
这个线程,之后的多次调用则可以避免CAS操作
,说白了就是置个变量,如果发现为true
则无需再走各种加锁/解锁
流程。
轻量级锁
轻量级锁是由偏向所升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;
重量级锁
重量锁在JVM
中又叫对象监视器(Monitor
),它很像C中的Mutex
,除了具备Mutex(0|1)
互斥的功能,它还负责实现了Semaphore(信号量)
的功能,也就是说它至少包含一个竞争锁的队列,和一个信号阻塞队列(wait队列),前者负责做互斥,后一个用于做线程同步。
自旋锁
线程自旋说白了就是让cpu在做无用功,比如:可以执行几次for循环,可以执行几条空的汇编指令,目的是占着cpu不放,等待获取锁的机会。如果旋的时间过长会影响整体性能,时间过短又达不到延迟阻塞的目的。