目前不涉及原理层面的比较,简单介绍一下两者的异同
相同点
1.在功能上它们都是通过加锁方式来协调多线程对共享变量的访问,而且都是同步式阻塞。
2.都是可重入锁,即一个线程可以多次获得同一把锁。
3.都保证了可见性、原子性(互斥性)。
不同点
1、两者最大的区别就是synchronized是Java内置的关键字,是原生语法层面的互斥,是JVM层面的同步机制。而ReentrantLock是JDK5之后提供的API层面的互斥锁,需要lock(),unlock()方法结合try/finally语句实现。
2、在性能上,synchronized优化前,它的性能相比ReentrantLock要差一些。但在synchronized优化后,两者性能差距不大了。
3、synchronized隐式地获得、释放锁,ReentrantLock显式地获得、释放锁。
4、相比于synchronized,ReentrantLock提供了一些高级功能,主要有三种。
等待可中断,即持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待。这相对于synchronized来说可以避免出现死锁的情况。通过lock.lockInterruptibly()来实现这个机制。ReentrantLock可以实现公平锁。ReentrantLock可以通过Condition类绑定多个条件,实现分组唤醒需要唤醒的线程们。synchronized只能随机唤醒一个线程或唤醒全部线程。
5、通过Lock能知道是否成功获取到锁,而synchronized无法做到。