Synchronized的偏向锁、轻量级锁、重量级锁

Synchronized的偏向锁、轻量级锁、重量级锁

(1)偏向锁:在锁对象的对象头中记录一下当前获取到该锁的线程id,该线程下次如果还要来获取锁的时候就可以直接获取到了。
(2)轻量级锁:由偏向锁升级而来,当一个线程获取到锁后,此时这把锁是偏向锁,如果此时有第二个线程来竞争锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁分开,轻量级锁是通过自旋实现的,并不会阻塞线程。
(3)如果自旋多次还没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞。
(4)自旋锁:自旋锁就是线程在获取锁的过程中,不会阻塞线程,也就无所谓唤起线程,阻塞和唤醒这两个步骤都是需要操作系统去实现的,比较消耗时间,自旋锁是线程通过CAS获取预期的标记,如果没有获取到,则继续循环获取,如果获取到了则表示获取到了锁,这个过程线程一直在运行中,相对而言没有使用太多的操作系统资源,比较轻量。

Synchronized和ReentrantLock的区别

(1)synchronized是一个关键字,ReentrantLock是一个类。
(2)synchronized会自动的加锁和释放锁,RenntrantLock需要程序员手动释放和加锁。
(3)synchronized的底层是JVM层面的锁,ReentrantLock是API层面的锁。
(4)synchronized是非公平锁,ReentrantLock可以选择公平锁还是非公平锁。
(5)synchronized锁住的是对象,锁信息保存在对象头中,ReentrantLock通过代码中int类型的state标识来代表锁的状态。
(6)synchronized底层有一个锁升级的状态。

猜你喜欢

转载自blog.csdn.net/weixin_49131718/article/details/131794999