ReentrantLock 源码解析

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

public class App {
public static void main(String[] args) {

test1();
}

public static void test1() {
Lock lock = new ReentrantLock();
Thread t1 = new Thread(() -> {
lock.lock();
System.out.println("线程 " + Thread.currentThread().getId() + " 获得锁");
try {
Thread.sleep(50000000);
} catch (InterruptedException e) {
System.out.println("线程 " + Thread.currentThread().getId() + " 释放锁");
} finally {
lock.unlock();
}
});
t1.start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}


Thread t2 = new Thread(()->{
lock.lock();
System.out.println("线程 " + Thread.currentThread().getId() + " 获得锁");
lock.unlock();
});
t2.start();
Scanner scanner=new Scanner(System.in);
scanner.nextLine();
}

public static void test2(){

}
}
阅读更多

Java 对象深入探究

这篇博客是为了深入探究 Java 中对象的知识。

对象的创建

首先我们先看下一个简单创建对象的代码,看一个对象到底是如何在内存中创建的。

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
Person obj = new Person();
}


public class Person {
private int age=8;
private String name="fu";

}
阅读更多

synchronized 锁的升级过程

测试代码

为了更清楚的看 synchronized 的锁的升级的过程,我们用代码来打印对象的布局,使用的类库是:

1
2
3
4
5
6
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.14</version>
<scope>provided</scope>
</dependency>
阅读更多

synchronized 关键字

Synchronized 是 Java 中的一种锁的方式,是在 JVM 层面一种锁。在 jdk 1.6以前是一种重量级锁,在经历过优化后 Synchronized 锁已经没有那么“重”了。

Synchronized 有 3 种使用方式:

  1. 普通同步方法,锁是当前实例对象
  2. 静态同步方法,锁是当前类的Class对象
  3. 同步代码块,锁是Synchonized括号里配置的对象
阅读更多

Big-Edian 存储和 Little-Edian 存储

在 JVM 虚拟机规范中有对 class 字节内容的顺序的一句话,多字节数据项总是按照 Big-Endian 的顺序进行存储,刚开始不太明白,只是根据规范解析了一下,具体的java 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13

public ClassReadCursor(String filePath, ClassParseInfo classParseInfo) {
try {
this.classParseInfo = classParseInfo;
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
this.dataInputStream = new DataInputStream(new ByteArrayInputStream(byteBuffer.array()));
} catch (IOException e) {
e.printStackTrace();
}

}

阅读更多

go 下载速度慢

linux 和 mac

1
echo "export GOPROXY=https://goproxy.cn" >> ~/.profile && source ~/.profile
阅读更多

西瓜视频爬虫

写了一个小工具,主要是爬取西瓜视频的教程,方便下载下载学习,语言使用 goLang . 软件是编译成 exe 文件,想要源码直接联系我。

  1. 默认支持同时 5 个协程同时下载
  2. 支持单个和合集下载,最多默认支持 20集下载
  3. 纯属技术交流,不要用于其他。
  4. golang 编译成 exe 竟然会报毒,信任即可
阅读更多
Redis 系列--06. Redis 架构

Redis 系列--06. Redis 架构

Redis 在实际使用的过程中,针对不同的场景需要对应的架构,这篇博客主要是总结 Redis 在实际在生产中遇到的架构以及各自的有点和缺点。

1. 单机架构

Redis 架构

阅读更多
Redis底层原理--05. Redis 数据库

Redis底层原理--05. Redis 数据库

1数据库

1.1 数据结构

Redis 中的每个数据库,都由一个 redis.h/redisDb 结构表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct redisDb {
// 保存着数据库以整数表示的号码
int id;
// 保存着数据库中的所有键值对数据
// 这个属性也被称为键空间(key space)
dict *dict;
// 保存着键的过期信息
dict *expires;
// 实现列表阻塞原语,如 BLPOP
// 在列表类型一章有详细的讨论
dict *blocking_keys;
dict *ready_keys;
// 用于实现 WATCH 命令
// 在事务章节有详细的讨论
dict *watched_keys;
} redisDb;
阅读更多
Redis底层原理--04. Redis 功能的实现