说说synchronized和ReentrantLock的区别?

锁的实现: synchronized是Java语言的关键字,通过JVM实现。而ReentrantLock是基于JDK的API层面实现的,通常使用lock()unlock()方法结合try-finally语句块来完成。

性能: 在JDK1.6之前,synchronized的性能相对较低,而ReentrantLock的性能较好。然而,自JDK6开始,synchronized进行了优化,引入了自适应自旋和锁消除等技术,使得两者的性能差距不大。

功能特点:

  • ReentrantLock相对于synchronized提供了一些高级功能,例如可中断的等待、可实现公平锁和选择性通知。
  • ReentrantLock通过lock.lockInterruptibly()方法实现了线程的可中断等待机制。
  • ReentrantLock可以选择是公平锁还是非公平锁,而synchronized只能使用非公平锁。公平锁指的是先等待的线程先获得锁。
  • synchronized结合wait()notify()/notifyAll()方法实现等待/通知机制,而ReentrantLock类通过Condition接口和newCondition()方法来实现类似的功能。
  • 使用ReentrantLock需要手动获取锁和释放锁,在使用时通常与finally语句块结合,而synchronized不需要手动释放锁,由JVM自动管理。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题