美文网首页
synchronized与ReentrantLock的区别

synchronized与ReentrantLock的区别

作者: 挖打发 | 来源:发表于2021-05-02 18:00 被阅读0次

    1 底层实现

    synchronize是jvm层的锁,是java的关键字,通过monitor实现(monitorenter和monitorexit),reentrantLock是jdk1.5以来提供的API层面的锁,synchronize是通过锁的升级(偏向锁 -> 轻量级锁 -> 重量级锁)完成的,偏向锁:偏向第一个获取到锁的线程,如果第二次到同步代码块,线程判断持有锁的线程是自己就继续往下执行,由于之前没有释放,就不需要重新加锁,轻量级锁:第二个线程加入竞争,就会转为轻量级锁(自旋锁),第二个线程通过不断循环判断是否可以获得锁,获得锁的操作就是CAS,重量级锁:当自旋操作达到一定的次数(jvm默认为10次)就会将轻量级锁转换为重量级锁,当新的线程到达时判断当前线程为重量级锁,新的线程就会挂起,等待当前线程执行完任务后唤醒新的线程,reentrantLock是通过CAS自旋保证原子性和volatile保证可见性实现锁的功能

    2 手动性

    synchronize是自动的,不需要用户去手动释放锁,reentrantLock是手动的,需要手动释放锁,一般在finally块中释放锁

    3 中断性

    synchronize不可中断,reentrantLock可以中断线程去等待锁

    4 公平性

    synchronize是不公平的,不会按等待锁的线程到达顺序去分配锁,reentrantLock可以设为公平,也可以设为不公平

    5 条件性 

    synchronize不可绑定condition,只能通过object的wait/notify/notifyAll唤醒随机线程或者唤醒全部线程,而reentrantLock绑定condition,通过await/singal实现线程的精确唤醒

    相关文章

      网友评论

          本文标题:synchronized与ReentrantLock的区别

          本文链接:https://www.haomeiwen.com/subject/bmgfdltx.html