ReentrantLock
ReentrantLock
- 公平锁和非公平锁
- 默认使用非公平锁
- 可重入是通过Thread对象实现
- 这个锁最大支持 同一个线程递归获得 2147483647 (2^31) 次锁 . 否则会抛出error异常
- 只是持有锁线程可以释放锁
- 保留持有锁的Thread对象,有两个用处
- 可重入锁, 相同对象再次拿锁时,可以直接获得锁
- 释放锁,只有持有锁的Thread可以释放锁
- 反序列化
- Sync接口
- 同步器
- 提供所有实现机制
- NoFairSync类,非公平锁. 性能相对好 . (默认)
- 非公平锁
- 可能有些队列中的对象一直得不到执行.
- 所有对象来争抢锁 , 优先级低的线程, 可能会长时间得不到锁.
- 存在线程争抢
- FairSync类,公平锁性能低, 非常低.
- 部分执行时间很长的,不会释放锁 . 其余的只能等待.
- 对队列的顺序读写,性能相对随机读写要低
- 可能有些线程一直得不到执行.
- 当前一个锁执行时间很长时 , 后面的锁就一直得不到执行
怎么保证可重入锁: , 本地持有线程对象,是线程对象: Thread
- 获取锁后,一定要有try代码块, 并在finally中执行unlock();
lock()和 tryLock()和tryLock(timeout , timeunit)有什么区别?
- lock() : 按不同锁类型去加锁,公平锁和非公平锁都要去队列转一遭
- tryLock(): 直接按非公平锁尝试去加锁(就算设置了公平锁),只加锁一次,无论成功还是失败,都立即返回结果
- tryLock(timeout , timeunit): 在尝试获取锁时,指定等待时间,当 timeout==0 时, 该方法等同于 lock()
总结
ReentrantLock 定义一种锁的实现 , 大部分逻辑还是使用AQS的 . 对于锁来说 , AQS才是重点.