java中的锁大概有3中,重量级锁,轻量级锁和偏向锁
现在来说一下他们的区别:
什么是重量级锁?
要搞清楚重量级锁,首先你要知道java 的内存模型。 jdk1.8 后 java使用的是HotSopt 内存模型。当你在启动一个线程的时候操作系统对应的会启动一个线程。 而当你在线程上加锁的时候,把这个加锁任务交个操作系统去做,这就是重量级锁。
什么是轻量级锁?
轻量级锁其实不是锁,用的是CAS -> compare and swap (比较并更新)
当多个线程同时拿到 A=1,并且都要对做 A+1 操作的时候,每个线程都记录上一次读取到A 的值,在修改是再拿出A 对比一下是不是和上次的一样,如果是就更新操作,否则再读取一次并做修改。 如此循环。cpu需要管理线程的循环状态。
什么是偏向锁?
偏向锁不是锁,偏向锁更像一个标签,标志。被偏向的线程会告诉其他线程,你们别抢了,这个任务由我来完成。 因为大部分情况下,即使我们使用了加锁操作,其实仍然是当线程在运行,所以减少线程竞争,加个偏向锁。
锁的状态会发生变化吗?
这3种锁都有对应的应用场景。
当一个线程在运行的时候使用偏向锁可以节省线程切换带来的消耗。
当少量线程竞争时会升级成轻量级锁,每个线程采用自旋的方式来工作。
当大量线程竞争时如果还用线程自旋的话cpu显然就会忙不过来,这个时候就需要升级重量级锁。
重量级锁是由操作系统将资源放到一个队列里面进行管理。