• 多线程条件通行工具——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)
      返回等待目标条件的所有线程
  • 相关阅读:
    STM32的CRC32 软件实现代码
    AES CBC/CTR 加解密原理
    Either, neither, both
    Answer Sheet
    Both
    How to convert a byte to its binary string representation
    how convert large HEX string to binary array ?
    TEA -- Tiny Encryption Algorithm
    DES
    IAR EWARM Checksum Technical Note
  • 原文地址:https://www.cnblogs.com/hvicen/p/6239571.html
Copyright © 2020-2023  润新知