synchronized与lock的区别 - 阿里技术面试

1. 问题背景

在 Java 并发编程中,锁有两种实现:

  • synchronized

  • lock

在面试中,从解决并发的功能角度来说,它们都能通过上锁的方式,解决对资源的抢占问题。

但是它俩的区别是什么呢?

2. synchronized与lock的区别

2.1 底层实现机制不同

  • synchronized: Java 中的关键字,是由 JVM 来维护的,是 JVM 层面的锁。

  • lock:是 JDK5 以后才出现的具体的类,使用lock是调用对应的API,是API层面的锁

synchronized 是底层是通过 monitorenter 进行加锁,通过monitorexit来退出锁的。

实现机制是底层是通过monitor对象来完成的,其中的 wait/notify 等方法也是依赖于 monitor 对象的。

而 lock 是通过调用对应的 API 方法来获取锁和释放锁的。

2.2 使用方式不同

  • synchronized 是隐式锁。

  • lock 是显示锁。

所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。

在使用 synchronized 关键字的时候,由程序自动获取锁和释放锁了,如果非逻辑问题的话话,是不会出现死锁的。

在使用 lock 的时候,我们使用者需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。手动获取锁方法:lock.lock()。释放锁:unlock方法。需要配合tyr/finaly语句块来完成。

2.3 等待的处理方式不同

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

  • lock 可以中断的。

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

2.4 加锁的时候是否可以公平

  • synchronized 非公平锁。

  • lock 两者都可以的,默认是非公平锁,在其构造方法的时候可以传入Boolean值来决定。

2.5 性能比较

  • synchronized 由于给jvm 托管,在 Java1.5 中性能较为低效, Java 1.6 中进行了优化。

  • lock 相比 synchronized 性能要好些。

2.6 锁的方式

  • synchronized 悲观锁。

  • lock 乐观锁。

展开剩余53%