博客
关于我
AQS同步组件
阅读量:484 次
发布时间:2019-03-07

本文共 1111 字,大约阅读时间需要 3 分钟。

队列同步器AQS是构建锁或其他同步组件的核心框架,支持独占式和共享式同步模式的切换。其基于CLH同步队列机制,采用FIFO方式管理请求共享资源的线程,确保资源访问的有序性和高效性。独占式同步适用于互斥资源访问,而共享式同步则允许多个线程同时接入资源,两者结合使用能够满足多样化的应用场景需求。

在独占式同步组件中,ReentrantLock是最常用的实现,其基于资源独占的原理,支持公平锁和非公平锁模式。框架中使用的独占式状态机制,确保同一线程在持有资源时的额外请求自动通过而非被阻塞。这一机制避免了资源浪费,同时保证了系统的高效运行。

对于内核级抢占式同步,Mutex提供了更底层的同步接口,适用于_native_thread API环境。这类锁通常没有显式的类型区分,资源的互斥性由底层操作系统机制来保证,且支持优化以减少上下文切换的开销。

在共享式同步组件中,Semaphore是一个经典的资源限制机制。它专门用于保护某种资源的使用数量不超过规定限制,支持公平锁和非公平锁模式。通过设置适当的信号次数,可以精确控制线程池的规模或资源的使用频率,避免资源拥堵问题。

与Semaphore类似但功能更强大的组件是CountDownLatch。它通过一个不可变的计数器来管理资源使用条目。与Semaphore不同的是,CountDownLatch需要所有线程都完成任务后才能恢复,适用于实现资源池的线程管理或任务等待。然而,其缺点在于计数器在首次构造时就固定化设置,无法在运行期进行状态重置,这在某些场景下显得不够灵活。

CyclicBarrier则在资源管理方面更加灵活。它不仅支持多线程等待,而且允许计数器重新初始化。CyclicBarrier还提供了更加强大的灵活性,能够支持多复杂的用途,如资源复用和循环任务管理。这使其成为生产环境中高级同步需求的理想选择。

值得注意的是,CountDownLatCh和CyclicBarrier在功能上有显著不同。CyclicBarrier不仅可以多次重置计数器,而且模块化结构更加完善。它更像是一个可重复使用的同步阀门,而CountDownLatCh则更强调线程完成任务的计数和线程间的等待。这种区别使得其适用于不同的场景需求,开发者可以根据实际应用选择最合适的解决方案。

在实现独占和共享同步需求时,ReentrantReadWriteLock提供了更高级的资源管理机制。其分为读锁和写锁两种类型,支持读锁的共享使用和写锁的独占式管理。这种混合锁模式在多线程环境下高效处理资源分配,能够在服务于大量读操作的同时,保证写操作的严格控制。这样的设计非常适用于复杂的数据共享场景。

转载地址:http://ayjcz.baihongyu.com/

你可能感兴趣的文章
.mpp文件在线打开网址
查看>>
C#中的委托(delegate)
查看>>
error C2061: syntax error : identifier 'string'
查看>>
webservice调用报错 SAXException
查看>>
Problem G. The Stones Game【取石子博弈 & 思维】
查看>>
洛谷多校第2轮.E——Anan and Minecraft【并查集】(判断图同构)
查看>>
AS构建Empty Android Things程序运行闪退
查看>>
HRBUST—1891 A + B Problem VII
查看>>
装饰模式
查看>>
责任链模式
查看>>
Jmeter-HTTP request的使用
查看>>
Jmeter-用户参数User Parameters(实践:接口请求入参参数化)
查看>>
Docker基础+Docker安装mysql
查看>>
框架综合实践(3)-业务逻辑businessView的封装
查看>>
Robot Framework 新建资源文件-用户关键字
查看>>
HDU - 4289 Control 拆点最大流,领悟拆点的真谛吧!
查看>>
HDU - 2732 Leapin‘ Lizards 拆点最大流+BFS 学好英语QAQ
查看>>
导弹拦截 NOIP1999 dilworth定理裸题
查看>>
应对unordered_map被卡的方法
查看>>
Android架构——旧版 HAL
查看>>