天天看点

美团一面:java中synchronized和ReentrantLock有哪些不同点?

作者:学渣报到

synchronized和ReentranLook有哪些不同点?

美团一面:java中synchronized和ReentrantLock有哪些不同点?

基本

synchronized是语法层面的一个关键字,底层是jvm实现的,相当于是C++代码实现的。ReentrantLock是一个类。

美团一面:java中synchronized和ReentrantLock有哪些不同点?

在使用的时候,synchronized会自动的去帮我们去加锁、去释放锁,而ReentrantLock就需要刚刚说的去调方法,手动加锁、释放锁。但是在使用ReentrantLock的时候,我们要去生成ReentrantLock的对象,然后去调用它的look方法,unlock方法,trylock方法去加锁、解锁。

是否公平锁

synchized的只能是非公平锁,而ReentrantLock不一样,它既可以是公平锁,也可以是非公平锁。什么是公平锁,什么是非公平锁?公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 公平锁的优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

synchronized锁的是对象,就不管说普通对象还是类对象,都是对象,锁的信息是保存在对象头。什么是锁的信息呢?就是当前这把锁是被哪个线程占用了,大家最核心的就是这个信息。像ReentrantLock是通过一个ReentrantLock对象的state这个属性来表示这把锁有没有被占用到,它通过一个int类型属性来表示锁的状态的。

美团一面:java中synchronized和ReentrantLock有哪些不同点?

是否升级

synchronized底层其实会有一个锁升级的过程,偏向锁到轻量级,再到重量级锁。但是ReentrantLock没有这个过程,tryLock方法和lock方法,tryLock方法它底层相当于轻量级锁,会去自旋。lock方法相当于是一个重量级锁,没有这个自旋的过程,调哪个方法,它就是哪个锁。

锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(无锁、偏向锁、轻量级锁、重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级(从低级别到高级别),不能锁降级(高级别到低级别),意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。

美团一面:java中synchronized和ReentrantLock有哪些不同点?

以上就是这两个的不同点