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

参考文章:

《“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)
    返回等待目标条件的所有线程

多线程条件通行工具——AbstractQueuedSynchronizer的更多相关文章

  1. 多线程条件通行工具——CountDownLatch

    CountDownLatch的作用是,线程进入等待后,需要计数器达到0才能通行. CountDownLatch(int)构造方法,指定初始计数. await()等待计数减至0. await(long, ...

  2. 多线程条件通行工具——CyclicBarrier

    CyclicBarrier的作用是,线程进入等待后,需要达到一定数量的等待线程后,再一次性开放通行. CyclicBarrier(int, Runnable)构造方法,参数1为通行所需的线程数量,参数 ...

  3. 多线程条件通行工具——Semaphore

    Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...

  4. 多线程IP获取工具(C#)

    以前帮一个朋友写的“IP采集工具”! Control.CheckForIllegalCrossThreadCalls = false; 多线程,测试后还比较稳定. 500线程时候,CPU5%左右,内存 ...

  5. Linux 多线程条件变量同步

    条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的 ...

  6. C++11并发——多线程条件变量std::condition_variable(四)

    https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...

  7. posix多线程--条件变量

    条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...

  8. 使用java多线程分批处理数据工具类

    最近由于业务需要,数据量比较大,需要使用多线程来分批处理,提高处理效率和能力,于是就写了一个通用的多线程处理工具,只需要实现自己的业务逻辑就可以正常使用,现在记录一下 主要是针对大数据量list,将l ...

  9. linux下多线程断点下载工具-axel

    今天要下载一下14G左右的文件,用wget约10小时,后来发现linux下有个多线程支持断点续传的下载工具axel,试了一下,下载速度大大增加. 包地址:http://pkgs.repoforge.o ...

随机推荐

  1. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  4. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  5. C++的内存泄漏检测

    C++大量的手动分配.回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,最后掏空内存. 这里介绍一种在debug模式下测试内存泄漏的方法. 首先在文件的开头以确定的顺序写下这段代码: ...

  6. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

  7. iOS开源项目周报1222

    由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ...

  8. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  9. IOS开发基础知识--碎片51

    1:https关闭证书跟域名的验证 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; securityPolic ...

  10. Windows Server 2008 R2 下配置TLS1.2,添加自签名证书

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...