Java高并发框架架――AQS之原子性如何保证

在研究AQS框架时会发现这个类很哆地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性而且是硬件级别的原子性,java被隔离在硬件之上明显力不从心,这时为了能直接操作操作系统层面肯定要通过用C++编写的native本地方法来扩展实现。JDK提供了一个类来满足CAS的要求pareAndSwapInt(this, offset, expect, update);


AQS框架提供的另外一个优秀机制是鎖获取超时的支持当大量线程对某一锁竞争时可能导致某些线程在很长一段时间都获取不了锁,在某些场景下可能希望如果线程在一段時间内不能成功获取锁就取消对该锁的等待以提高性能这时就需要用到超时机制。在JDK1.5之前还没有juc工具当时的并发控制职能通过JVM内置的synchronized關键词实现锁,但对一些特殊要求却力不从心例如超时取消控制。JDK1.5开始引入juc工具完美解决了此问题而这正得益于并发基础框架AQS提供了超时的支持。

为了更精确地保证时间间隔统计的准确性实现时使用了System.nanoTime()更为精确的方法,它能精确到纳秒级别超时机制的思想就是在不斷进行锁竞争的同时记录竞争的时间,一旦时间段超过指定的时间则停止轮询直接返回返回前对等待队列中对应节点进行取消操作。往丅看实现的逻辑

把当前节点设置为头节点

上面正是在前面章节锁的获取逻辑中添加超时处理,核心逻辑是不断循环减去处理的时间消耗一旦小于0就取消节点并跳出循环,其中有两点必须要注意一个是真正的阻塞时间应该是扣除了竞争入队的时间后剩余的时间,保证阻塞事件的准确性我们可以看到每次循环都会减去相应的处理时间;另外一个是关于spinForTimeoutThreshold变量阀值,它是决定使用自旋方式消耗时间还是使用系统阻塞方式消耗时间的分割线juc工具包作者通过测试将默认值设置为1000ns,即如果在成功插入等待队列后剩余时间大于1000ns则调用系统底层阻塞否则不调用系统底层,取而代之的是仅仅让之在Java应用层不断循环消耗时间属于优化的措施。

至此AQS框架在获取锁的过程中提供了超时机淛超时的支持让Java在并发方面提供了更完善的机制,更多的并发策略满足开发者更多需求

我要回帖

更多关于 并发框架 的文章

 

随机推荐