说说synchronized和ReentrantLock的区别?

说说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自动管理。