更新时间:2020-12-08 来源:黑马程序员 浏览量:
ReentrantLock是Lock的实现类,是一个互斥的同步锁。从功能角度,ReentrantLock比Synchronized的同步操作更精细(因为可以像普通对象一样使用),甚至实现Synchronized没有的高级功能,如:
·等待可中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,对处理执行时间非常长的同步块很有用。
·带超时的获取锁尝试:在指定的时间范围内获取锁,如果时间到了仍然无法获取则返回。
·可以判断是否有线程在排队等待获取锁可以响应中断请求与Synchronized不同,当获取到锁的线程被中断时,能够响应中断,中断异常将会被抛出,同时锁会被释放。
·可以实现公平锁。
从锁释放角度, Synchronized在JVM层面上实现的,不但可以通过一些监控工具监控 Synchronized的锁定,而且在代码执行岀现异常时,JVM会自动释放锁定;但是使用Locκ则不行,Lock是通过代码实现的,要保证锁定一定会被释放,就必须将unlock()放到finally{}中。
从性能角度,Synchronized早期实现比较低效,对比ReentrantLock,大多数场景性能都相差较大。但是在Java 6中对其进行了非常多的改进,在竞争不激烈时,Synchronized的性能要优于ReetrantLock;在高竞争情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常。
猜你喜欢