Java显示锁和隐式锁的区别

显示锁lock和隐式锁synchronized的区别

一、层面不同

  • synchronized:Java中的关键字,是由JVM来维护的,是JVM层面的锁。
    • synchronized底层是通过monitorenter进行加锁
      底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖于monitor对象的。并且只有在同步块或同步方法中,JVM才会调用monitory对象的,才可以调用wait/notify等方)
    • 通过monitorexit来退出锁
  • Lock:是JDK5以后才出现的具体的类。使用lock是调用对应的API,是API层面的锁。
    • lock是通过调用对应的API方法来获取锁和释放锁的。

二、使用方式不同

  • synchronized
    程序能够自动获取锁和释放锁。Sync是由系统维护的,如果非逻辑问题的话话,不会出现死锁。
  • Lock
    需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。
    手动获取锁方法:lock.lock()。释放锁:unlock方法。并且需要配合tyr/finaly语句块来完成。

三、等待是否可中断

  • synchronized
    不可中断,除非抛出异常或者正常运行完成。

  • Lock
    可以中断的。
    中断方式:

    • 调用设置超时方法tryLock(long timeout ,timeUnit unit)
    • 调用lockInterruptibly()放到代码块中,然后调用interrupt()方法可以中断

四、加锁的时候是否可以设置成公平锁

  • synchronized
    只能为非公平锁。

  • lock:两者都可以的。默认是非公平锁。
    在其构造方法的时候可以传入Boolean值。true:公平锁、false:非公平锁

五、锁绑定多个条件来condition

  • synchronized
    不能精确唤醒线程。要么随机唤醒一个线程;要么是唤醒所有等待的线程。

  • Lock
    用来实现分组唤醒需要唤醒的线程,可以精确的唤醒。

六、性能区别

  • synchronized
    托管给JVM执行,Java1.5中,由于需要调用操作接口,可能导致加锁消耗时间过长,与Lock性比性能低。1.6以后,语义定义更加清晰,有适应自旋、锁粗化、锁消除、轻量级锁、偏向锁等,可进行许多优化,性能提高了,与Lock差不多。
  • Lock
    java写的控制锁的代码,性能高。

注:

参考自:凯哥java
链接:https://www.cnblogs.com/kaigejava/p/12710602.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值