多线程条件通行工具——AbstractQueuedSynchronizer
本文原创,转载请注明出处!
参考文章:
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的更多相关文章
- 多线程条件通行工具——CountDownLatch
CountDownLatch的作用是,线程进入等待后,需要计数器达到0才能通行. CountDownLatch(int)构造方法,指定初始计数. await()等待计数减至0. await(long, ...
- 多线程条件通行工具——CyclicBarrier
CyclicBarrier的作用是,线程进入等待后,需要达到一定数量的等待线程后,再一次性开放通行. CyclicBarrier(int, Runnable)构造方法,参数1为通行所需的线程数量,参数 ...
- 多线程条件通行工具——Semaphore
Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...
- 多线程IP获取工具(C#)
以前帮一个朋友写的“IP采集工具”! Control.CheckForIllegalCrossThreadCalls = false; 多线程,测试后还比较稳定. 500线程时候,CPU5%左右,内存 ...
- Linux 多线程条件变量同步
条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的 ...
- C++11并发——多线程条件变量std::condition_variable(四)
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...
- posix多线程--条件变量
条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...
- 使用java多线程分批处理数据工具类
最近由于业务需要,数据量比较大,需要使用多线程来分批处理,提高处理效率和能力,于是就写了一个通用的多线程处理工具,只需要实现自己的业务逻辑就可以正常使用,现在记录一下 主要是针对大数据量list,将l ...
- linux下多线程断点下载工具-axel
今天要下载一下14G左右的文件,用wget约10小时,后来发现linux下有个多线程支持断点续传的下载工具axel,试了一下,下载速度大大增加. 包地址:http://pkgs.repoforge.o ...
随机推荐
- Apache Ignite高性能分布式网格框架-初探
Apache Ignite初步认识 今年4月开始倒腾openfire,过程中经历了许多,更学到了许多.特别是在集群方面有了很多的认识,真正开始认识到集群的概念及应用方法. 在openfire中使用的集 ...
- .NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
- TDD在Unity3D游戏项目开发中的实践
0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- 3.Windows Server 2012 R2数据库部署
很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...
- Android 自定义 attr
好纠结,弄了一个下午老是报错如是总结一下安卓自定视图和自定义属性. (一)自定义属性 在Values文件下建立一个attrs.xml文件,attr的format可以参考:http://www.cnbl ...
- obj.style.z-index的正确写法
obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...
- [开发笔记]GCC 分支预测优化
#define likely(x) __builtin_expect(!!(x),1)#define unlikely(x) __builtin_expect(!!(x),0) 用于优化在做分支判断的 ...
- 使用rowid抽取数据方法以及大数据量游标卡住的应对
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...
- Android Studio快捷键
一.android studio 默认快捷键 刚开始接触一款开发软件,想必很想了解它的快捷方式,这会对你的编程起到很好的帮助,提高工作效率,接下来给你介绍下Android Studio一些常用的快 ...