ReentrantLock是JUC(java.util.concurrent)的一个组件,并且也是一个可重入锁。ReentrantLock有两个方法,一个是lock()用于加锁,一个是unlock()用于解锁,这样的做法有优点也有缺点:
缺点:程序员容易忘记解锁从而导致Bug的产生。
优点:更加的灵活,可以将lock()放在一个方法里,unlock()放进另一个方法里。
ReentrantLock还提供了另一个方法tryLock(),对于synchronized来说,如果锁被占用了,将会进入阻塞状态,直到对方释放锁,不管这个时间多久都会一直等待;而对于tryLock()来说,此处不留爷自有留爷处,tryLock()将会立即返回或者等待一段时间后返回。这样就会导致节省了很多的资源以及更多的操作空间。
以下内容转载synchronized 和 ReentrantLock 区别是什么?_ConstXiong-CSDN博客
synchronized 竞争锁时会一直等待;ReentrantLock 可以尝试获取锁,并得到获取结果
synchronized 获取锁无法设置超时;ReentrantLock 可以设置获取锁的超时时间
synchronized 无法实现公平锁;ReentrantLock 可以满足公平锁,即先等待先获取到锁
synchronized 控制等待和唤醒需要结合加锁对象的 wait() 和 notify()、notifyAll();ReentrantLock 控制等待和唤醒需要结合 Condition 的 await() 和 signal()、signalAll() 方法
synchronized 是 JVM 层面实现的;ReentrantLock 是 JDK 代码层面实现
synchronized 在加锁代码块执行完或者出现异常,自动释放锁;ReentrantLock 不会自动释放锁,需要在 finally{} 代码块显示释放
————————————————
版权声明:本文为CSDN博主「ConstXiong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/meism5/article/details/90413901