- 博客(3)
- 收藏
- 关注
原创 CountDownLatch原理
接着在循环中判断前驱节点是否为头节点,是的话判断state是否为0,是的话将自己设置为头节点,并调用doReleaseShared方法将下一个节点唤醒。否则的话通过LockSupport的park方法阻塞住线程。countDown调的是同步器的releaseShared方法,里面通过cas轮询将state减1,state为0时调用doReleaseShared方法将头节点的下一个节点唤醒。
2024-01-16 14:55:29 328 1
原创 SynchronousQueue原理
若队列为空(仅有傀儡节点)或者当前的请求与队列中节点的模式相同(一样是取或者一样是放),那就构造等待节点,等待节点中存放了元素,当前线程。非公平是TransferStack,等待链表是栈。若当前的请求与队列中节点的模式不同,那便将第一个实际节点(傀儡头节点的next)的元素cas替换成当前请求的元素,再将头节点指针cas指向该节点。SynchronousQueue添加元素跟获取元素都是调用Transfer的transfer方法,传递的元素e为null时代表着获取,传递的元素e非空时代表着添加。
2023-05-01 21:01:13 73
原创 FutureTask的get方法原理
FutrueTask的get会先判断state的值是否大于comleting,也就是执行完,是的话就判断state为normal正常的话,就返回outcome结果,为cancel取消的话,就抛取消异常,为异常的话,就抛出outcome记录的异常。执行任务的线程那边在执行完任务后,就把结果或者异常保存到outcome里,修改state的值,并且依次将队列里的结点出队并调用LockSupport的unpark方法唤醒节点里的线程。否则如果还未构造等待结点,那就构造等待结点,结点里保存了当前线程。
2023-04-30 16:11:26 559 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人