zoukankan      html  css  js  c++  java
  • 多线程条件通行工具——AbstractQueuedSynchronizer

    本文原创,转载请注明出处!

    参考文章:

    《“JUC锁”03之 公平锁(一)》

    《“JUC锁”03之 公平锁(二)》

    AbstractOwnableSynchronizer,用于供子类存取独占锁的所属线程。

    • #getExclusiveOwnerThread()/#setExclusiveOwnerThread(Thread):获取/设置独占锁的所属线程。

    AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer,用于操纵独占锁与共享锁,由子类提供线程获取锁与释放锁的策略,制定线程通行的条件。前者是操纵int,后者是操纵long。

    状态

    state由子类来赋于具体意义,可以作为一个锁的状态或其它意义。

    • #getState():int
      获取状态。
    • #setState(int)
      设置状态。
    • #compareAndSetState(int, int):boolean
      尝试设置状态,返回是否设置成功。

    独占锁 

    相关操作:

    • acquire(int)
      获取独占锁。
    • acquireInterruptibly(int)
      获取独占锁,可中断。
    • tryAcquireNanos(int, long):boolean
      获取独占锁,可中断,可超时,返回true表示操作成功,false表示操作失败。
    • #tryAcquire(int):boolean
      尝试获取独占锁,返回是否可以出队还是继续排队,供子类实现。
    • release(int):boolean
      释放独占锁,返回是否操作成功。
    • #tryRelease(int):boolean
      尝试释放独占锁,返回是否可以唤醒下一个线程,供子类实现。
    • Collection<Thread> getExclusiveQueuedThreads()
      返回队列中需要获取独占锁的所有线程。
    • #boolean isHeldExclusively()
      查看当前线程是否为独占锁所属线程,供子类实现。

    操作流程:

     

    共享锁

    相关操作:

    • acquireShared(int)
      获取共享锁。
    • acquireSharedInterruptibly(int)
      获取共享锁,可中断。
    • tryAcquireSharedNanos(int, long):boolean
      获取共享锁,可中断,可超时,返回true表示操作成功,false表示操作失败。
    • #tryAcquireShared(int):int
      尝试获取共享锁,返回大于或等于0表示可以出队,否则表示继续排队,供子类实现。
    • releaseShared(int):boolean
      释放共享锁,返回是否操作成功。
    • #tryReleaseShared(int):boolean
      尝试释放共享锁,返回是否可以唤醒下一个线程,供子类实现。
    • Collection<Thread> getSharedQueuedThreads()

      返回队列中需要获取共享锁的所有线程。

    操作流程:

     

    队列

    相关操作:

    • int getQueueLength()
      返回队列的长度
    • boolean hasQueuedThreads()
      返回队列中是否有线程
    • Collection<Thread> getQueuedThreads()
      返回队列中所有线程
    • Collection<Thread> getExclusiveQueuedThreads()
      返回队列中需要获取独占锁的所有线程
    • Collection<Thread> getSharedQueuedThreads()
      返回队列中需要获取共享锁的所有线程
    • boolean isQueued(Thread)
      查看指定线程是否位于队列中
    • boolean hasQueuedPredecessors()
      返回当前线程是否不位于队头,一般公平策略的子类需要使用到这个方法。
    • Thread getFirstQueuedThread()
      返回排于队头的线程。
    • boolean hasContended()
      查看是否曾经有线程入过队

    条件

    ConditionObject是一个内部类,其实现接口是Condition,供子类实现时选择是否提供创建。

    相关操作:

    • boolean owns(ConditionObject)
      查看目标条件对象是否所属该AbstractQueuedSynchronizer对象
    • boolean hasWaiters(ConditionObject)
      查看是否有等待目标条件的线程
    • int getWaitingThreads(ConditionObject)
      查看等待目标条件的线程数量
    • Collection<Thread> getWaitQueueLength(ConditionObject)
      返回等待目标条件的所有线程
  • 相关阅读:
    配置通过Console口登录交换机/路由器
    (十二)20大5G关键技术
    (十一)关于5G发展的28个核心问题,来自华为内部的深度解读
    (十)5G关键技术——Massive MIMO(大规模天线阵列)和beamforming(波束成形)
    (九)什么是5G
    (四)circularly symmetric complex zero-mean white Gaussian noise(循环对称复高斯噪声)
    小小知识点(十四)显示屏与主机之间连接,出现无信号字样时,应检查是否正确选择集显和独显VGA接口
    小小知识点(十三)如何修改PPT母版上无法直接点击修改的文字
    小小知识点(十二)利用MATLAB计算定积分
    小小知识点(十一)护眼色豆沙绿的设置
  • 原文地址:https://www.cnblogs.com/hvicen/p/6239571.html
Copyright © 2011-2022 走看看