0%

CountDownLatch功能很简单,它主要有两个方法,await()countDown(),初始创建的时候需要给它提供一个数值,调用countDown()方法会将数值减1,调用await()方法的时候会判断值是不是等于0,如果等于0就继续执行,否则就阻塞等待

1
2
3
4
5
6
// 初始化创建,值为1
CountDownLatch countDownLatch = new CountDownLatch(1);
// 如果countDownLatch中的值不是0则阻塞等待
countDownLatch.await();
// 将countDownLatch中的值进行减1
countDownLatch.countDown();

利用这两个方法,我们能用来做什么呢?

阅读全文 »

工作流程

AbstractQueuedSynchronizer 是一个用于在竞争资源(如多线程)时使用的同步器,它内部使用了一个int类型的字段status表示需要同步的资源状态, 并基于一个先进先出(FIFO)的等待队列,队列中的每个节点表示要获取资源的线程

同步器主要是用于控制资源的获取以及释放,它可以用于独占模式和共享模式,这里我们以独占模式为例

在获取和释放资源时,我们需要实现自己的尝试获取和尝试释放的方法,利用status字段来控制成功与否

阅读全文 »

Redis支持的主要有5种数据类型,string, list, set, zset , hash,但是对于每种数据类型,Redis都不是简单的使用一种数据结构来实现,而是根据数据量等因素使用多种数据结构(SDS、双向链表、hashtable等),来达到提高效率、节省空间的目的,可以使用object encoding <key> 来查看数据的内部结构

阅读全文 »

maven聚合

聚合的目的是为了快速构建项目,当我们有几个maven模块,想要一次性构建,而不是到每个模块下面去执行maven命令,这时候就需要使用maven聚合(或者称为多模块)。

使用聚合的时候,我们需要新建一个maven项目,由它来控制构建其他的项目,其pom.xml配置与其他普通maven项目的区别主要在以下两个地方:

  1. 打包类型(packaging)必须为pom
  2. 需要在其中添加modules标签,在其中使用module标签包括需要同时构建的maven模块的名称路径,路径为相对于此pom.xml文件的路径(如果与pom.xml文件同级则直接写项目名,如果在上一级则写…/项目名)。

这样当我们在此项目下执行构建的时候,就会同时构建其中配置的项目。

阅读全文 »

  • push 方法

将元素添加到数组尾部

1
2
var values = [1,2,3,4,5]
values.push(6,7) // values = [1,2,3,4,5,6,7]
  • pop 方法

将数组尾部元素弹出

1
2
var values = [1,2,3,4,5]
values.pop() // values = [1,2,3,4]
  • shift 方法

弹出数组头元素

1
2
var values = [1,2,3]
values.shift() // values = [2,3]
阅读全文 »

ECMAScript中有五种基本数据类型:Undefined, Null, Boolean, Number, String,一种复杂数据类型:Object

数据类型检测方法

typeof 函数,例:

1
2
var s = xx;
var res = typeof(s);
返回结果=typeof(res) 意义
typeof(res) === “undefined” 值未定义
typeof(res) === “boolean” 值为布尔类型
typeof(res) === “string” 值是字符串
typeof(res) === “number” 值为数值
typeof(res) === “object” 值是对象或null
typeof(res) === “function” 值是函数
阅读全文 »

基本结构

Redis中没有使用C语言原生的字符串,而是在其基础上包装了一个新的数据结构-SDS,其结构如下

1
2
3
4
5
6
7
8
9
10
11
// 指向下面结构中的buf指针
typedef char *sds;

struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; // 使用到的空间
uint8_t alloc; // 分配的C语言字符串空间,不包括头部和C字符串的中止符号null
unsigned char flags; // 使用后三位表示是sdshdr8/sdshdr16的类型
char buf[]; // 实际字符数组的空间
}
// 类似的还有 sdshdr16, sdshdr32等,用于节省空间
// 其中的所有方法都在此结构基础上实现
阅读全文 »

Python 中参数的传递非常灵活,不太容易记住理解,特整理如下备忘:

普通参数

即按照函数所需的参数,对应位置传递对应的值,可以对应 Java 中的普通参数

1
2
3
4
5
6
7
def max(a, b):
if a > b:
return a
else:
return b

max(5, 13) # = 13
阅读全文 »