显示锁lock和隐式锁synchronized的区别
一、层面不同
- synchronized:Java中的关键字,是由JVM来维护的,是JVM层面的锁。
- synchronized底层是通过monitorenter进行加锁
底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖于monitor对象的。并且只有在同步块或同步方法中,JVM才会调用monitory对象的,才可以调用wait/notify等方) - 通过monitorexit来退出锁
- synchronized底层是通过monitorenter进行加锁
- 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