「Java面试必会」synchronized 和 ReentrantLock有什么区别?

提到Java并发就会想到锁,面试中常问的就是Java常用的锁。目前最主要的两锁就是synchronized 和 ReentrantLock,谈谈他们有什么区别。

功能区别

基本意义:Synchronized是Java语言的关键字,因此Synchronized的锁是原生语法层面的互斥,需要JVM来实现。具体是通过对象内部的一个叫做监视器锁(monitor)来实现的。ReentrantLock,字面意思可重入锁,它是JDK1.5之后提供的API层面的互斥锁,锁的功能主要由2个方法完成,即lock()和unlock()。

易用性:Synchronized的使用比较方便简洁,由编译器去保证锁的加锁和释放,而ReentrantLock需要手动写代码来加锁和释放锁。
注意:为避免忘记手工释放锁而造成了死锁,最好在finally中声明释放锁。

灵活度:ReentrantLock要优于Synchronized,可以灵活控制在哪个位置加锁和解锁。

性能区别

我们平时写代码的时候用到Java最多的锁是Synchronized,单例模式中看到的锁也是Synchronized。这是为什么呢?除了Synchronized使用方面一些,其实和ReentrantLock对比,性能也丝毫不逊色,这里面说的当然是JDK1.5以后的版本了。

JDK1.6以前的版本没有优化,这时和ReentrantLock比肯定差很多。优化以后的Synchronized引入了包括偏向锁,轻量级锁等,这样就和ReentrantLock性能差不多太多了。

总结

综合来看,在两种方法都可用的情况下,建议使用synchronized。