Crescent

Crescent's Footprint

我们常用的线程安全的队列主要有BlockingLinkedQueue 、 ConcurrentLinkedQueue, 它俩的主要区别是一个使用了锁 ,一个基于CAS + volatile 实现的无锁队列,本篇我们主要分析ConcurrentLinedQueue的实现原理。

阅读全文 »

1. 欧拉回路定义

从一个顶点出发沿着图的边前进,切好经过每条边一次并且回到顶点,我们称为该图是否含有欧拉回路

定理一: 连通多重图具有欧拉回路当前仅当他的每个顶点都有偶数度
定理二: 连通多重图具有欧拉通路当前仅当它恰有两个奇数度顶点

在欧拉通路里,两个具有奇数度的顶点在建立一条虚拟边,那么就可以实现每个顶点都是偶数度,从而形成一条欧拉回路

1.1 欧拉路的判断

  1. 判断欧拉通路是否存在的方法
  • 有向图:图连通,有一个顶点出度比入度大1,有一个顶点入度比出度大1,其余都是出度=入度。
  • 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
  1. 判断欧拉回路是否存在的方法
  • 有向图:图连通,所有的顶点出度=入度。
  • 无向图:图连通,所有顶点都是偶数度。
阅读全文 »

1. 拓扑排序定义

按照wiki的解释,在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,才能称为该图的一个拓扑排序

  • 序列中包含每个顶点,且每个顶点只出现一次;
  • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。
阅读全文 »

CompletableFuture 是继FutuerTask之后,JDK1.8 引入的异步执行框架,可以自动检测触发下一级的关联任务,而不需要像 FutureTask 那样通过 get 获取结果后在执行的阻塞方式。

阅读全文 »

单调栈

1. 定义

单调栈: 栈内元素是单调递增或单调递减的栈,只在栈顶进行操作。 时间复杂度为O(n) 即所有元素只进栈一次

性质:1). 栈具有单调性 2). 元素入栈前会把破坏单调性的元素出栈,

阅读全文 »

指针就是一个变量,用于存储另一个变量的内存地址,所有的数据都存储在内存中,变量 只是给某一块的地址起的别名。

指针也是一个变量,他指向的内存存储的不仅是一个值,而且是另一个值的内存地址

指针图示

指针声明

指针的的语法声明如下:

1
2
3
4
5
6

// 通过符号*可以声明指针类型,t只保留类型为T的类型指针

// 任何未初始化的指针值都为nil
var t *T

阅读全文 »

GOPATH

在 go1.11 之前,不是使用gdep, glide,就是直接使用go get安装第三方包
工作空间Workspaces,是Go项目的根目录,也就是GOPATH 是GO项目必备的环境变量,用来存放Go的开发代码和第三方包代码,代码需要按照一定的目录安排

mod 特性

模块定义:

模块根目录和其子目录的所有包构成模块,在根目录下存在 go.mod 文件,子目录会向着父目录、爷目录一直找到 go.mod 文件

环境变量 GO111MODULE 开启或关闭模块支持

  • GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
  • GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
  • GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持
阅读全文 »

zsh自定义脚本

在 zsh脚本中添加自定义的快捷方式, 脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
function dkexec {
if [ -z "$1" ]; then
echo "Usage: dockerexec mysql|redis|..."
else
image=`docker ps | grep $1 | awk '{print $1}'`
if [ -z "$image" ]; then
echo "can't find image by name $1"
else
docker exec -it ${image} bash
fi
fi
}
阅读全文 »

前言

在java.util.concurrent包中有很多控制同步和并发的类,其中向ReentrantLock,CountDownLatch 内部实现都依赖与AbstractQueuedSynchronizer(用于控制同步的框架AQS),下面我们来分析独占模式下的原理

原理

队列同步器AQS是用来构建锁和其他同步组件的基础框架,内部使用int来表示成员的同步状态,通过内置的FIFO队列来完成资源获取线程的排序工作,其中成员变量包括 内部状态state 、等待队列的对头head(对头是一个空节点,也可以认为是当前持有锁的线程)、等待队列的队尾tail,都是通过volatile修饰,保证在并发过程中对其他线程可见

阅读全文 »
0%