synchronized和ReentrantLock的区别

之前很多同学面试Java开发岗位被问到了synchronized和ReentrantLock的区别这个问题。带着好奇心,我就去查了一下,没想到在细节上居然有这么大的区别。

除了synchronized关键字之外,我们还可以使用java.util.concurrent中的重入锁(ReentrantLock)来实现同步,在基本用法上,他们很相似,都具备一样的 线程重入 的特性。在代码写法上有点区别:ReentrantLock表现为API层面的互斥锁(lock()和unlock()方法配合try catch语句块来完成),synchronized表现为原生语法层面的互斥锁。不过,ReentrantLock相比synchronized增加了一些高级功能。主要有一下3项:等待可中断、可实现公平锁、锁可以绑定多个条件。

  • 等待可中断是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可中断特性对处理执行时间非常长的同步块很有帮助。
  • 公平锁 是指多个线程在等待同一个锁时,必须按照申请锁的时间来一次获得锁,而非公平锁不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁。synchronized中的锁时非公平的,ReentrantLock默认情况也是非公平的,但也可以通过代布尔值的函数要求使用公平锁。
  • 锁绑定是指一个ReentrantLock对象可以同时绑定多个Condition对象,而在synchronized中,锁对象的wait()和notify()或notifyAll()方法可以实现一个隐含的条件,如果要和多于一个条件关联的时候,就不得不额外添加一个锁,而ReentrantLock则无需这样做,只需要多次调用newCondition()方法即可。

JDK 1.6发布之后,synchronized和ReentrantLock的性能基本上完全持平,提倡在synchronized能实现需求的情况下,优先考虑使用synchronized。

坚持原创技术分享,您的支持将鼓励我继续创作!
显示 Gitment 评论