ConcurrentLinkedQueue 源码解析
我们常用的线程安全的队列主要有BlockingLinkedQueue 、 ConcurrentLinkedQueue, 它俩的主要区别是一个使用了锁 ,一个基于CAS + volatile 实现的无锁队列,本篇我们主要分析ConcurrentLinedQueue的实现原理。
我们常用的线程安全的队列主要有BlockingLinkedQueue 、 ConcurrentLinkedQueue, 它俩的主要区别是一个使用了锁 ,一个基于CAS + volatile 实现的无锁队列,本篇我们主要分析ConcurrentLinedQueue的实现原理。
从一个顶点出发沿着图的边前进,切好经过每条边一次并且回到顶点,我们称为该图是否含有欧拉回路
定理一:
连通多重图具有欧拉回路当前仅当他的每个顶点都有偶数度定理二:
连通多重图具有欧拉通路当前仅当它恰有两个奇数度顶点
在欧拉通路里,两个具有奇数度的顶点在建立一条虚拟边,那么就可以实现每个顶点都是偶数度,从而形成一条欧拉回路
CompletableFuture 是继FutuerTask之后,JDK1.8 引入的异步执行框架,可以自动检测触发下一级的关联任务,而不需要像 FutureTask
那样通过 get
获取结果后在执行的阻塞方式。
‘
在 go1.11 之前,不是使用gdep, glide,就是直接使用go get安装第三方包
工作空间Workspaces,是Go项目的根目录,也就是GOPATH
是GO项目必备的环境变量,用来存放Go的开发代码和第三方包代码,代码需要按照一定的目录安排
模块根目录和其子目录的所有包构成模块,在根目录下存在 go.mod 文件,子目录会向着父目录、爷目录一直找到 go.mod 文件
环境变量 GO111MODULE 开启或关闭模块支持
$GOPATH/src
外面且根目录有 go.mod 文件时,开启模块支持在java.util.concurrent包中有很多控制同步和并发的类,其中向ReentrantLock,CountDownLatch 内部实现都依赖与AbstractQueuedSynchronizer(用于控制同步的框架AQS),下面我们来分析独占模式下的原理
队列同步器AQS是用来构建锁和其他同步组件的基础框架,内部使用int来表示成员的同步状态,通过内置的FIFO队列来完成资源获取线程的排序工作,其中成员变量包括 内部状态state 、等待队列的对头head(对头是一个空节点,也可以认为是当前持有锁的线程)、等待队列的队尾tail,都是通过volatile修饰,保证在并发过程中对其他线程可见