深度解析Java8 – AbstractQueuedSynchronizer的实现分析(下)
前言
经过本系列的上半部分JDK1.8 AbstractQueuedSynchronizer的实现分析(上)的解读,相信很多读者已经对AbstractQueuedSynchronizer(下文简称AQS)的独占功能了然于胸,那么,这次我们再借助另一个工具类:CoutDownLatch,换个角度看看AQS的另外一个重要功能——共享功能的实现。
经过本系列的上半部分JDK1.8 AbstractQueuedSynchronizer的实现分析(上)的解读,相信很多读者已经对AbstractQueuedSynchronizer(下文简称AQS)的独占功能了然于胸,那么,这次我们再借助另一个工具类:CoutDownLatch,换个角度看看AQS的另外一个重要功能——共享功能的实现。
本文首发在infoQ :www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer
Java中的FutureTask作为可异步执行任务并可获取执行结果而被大家所熟知,通常可以使用future.get()来获取线程的执行结果,在线程执行结束之前,get方法会一直阻塞状态,直到call()返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是FutureTask的以上功能却是依靠通过一个叫AbstractQueuedSynchronizer的类来实现,至少在JDK 1.5、JDK1.6版本是这样的(从1.7开始FutureTask已经被其作者Doug Lea修改为不再依赖AbstractQueuedSynchronizer实现了,这是JDK1.7的变化之一)。但是AbstractQueuedSynchronizer在JDK1.8中还有如下图所示的众多子类:
版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿
今天看到 这篇文章:您还有心跳吗?超时机制分析 觉得挺有意思,有兴趣的同学可以先看看他的文章,简单记录了下自己的一个想法,无论好坏,权当参与讨论,共同进步吧。
其实 lz 一直限制在了取系统时间耗时的问题上,所以,一直想变相的通过各种手法排除掉获取系统时间的逻辑,比如使用“次数”来对连接实现超时控制,但其实,使用次数来表示超时控制本身就是个伪命题, 比如,在超时次数的阀值是100,如果在90次后,就一直没有被其他线程使用,一直不到阀值,那怎么去将这个连接释放掉呢?
所以,我想到了另外一种方式解决这个问题: 阅读全文
版权声明:本文为本作者原创文章,转载请注明出处。感谢码梦为生| 刘锟洋 的投稿。
在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurrent包提供的一种独占锁的实现。它继承自Dong Lea的 AbstractQueuedSynchronizer(同步器),确切的说是ReentrantLock的一个内部类继承了AbstractQueuedSynchronizer,ReentrantLock只不过是代理了该类的一些方法,可能有人会问为什么要使用内部类在包装一层? 我想是安全的关系,因为AbstractQueuedSynchronizer中有很多方法,还实现了共享锁,Condition(稍候再细说)等功能,如果直接使ReentrantLock继承它,则很容易出现AbstractQueuedSynchronizer中的API被误用的情况。
阅读全文