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才是重点.

posted @ 2019-12-24 10:26  孙行者、  阅读(204)  评论(0编辑  收藏  举报