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

  • 相关阅读:
    Java统计程序运行时间(转)
    有符号定点数的表示方法
    移位运算符
    索引
    self与super的区别(转)
    Java经典题型(未完成)
    ObjectiveC 的 self 和 super 详解
    边界计算与不对称边界
    各种排序总结
    运算符的优先级
  • 原文地址:https://www.cnblogs.com/ElEGenT/p/12090055.html
Copyright © 2020-2023  润新知