Skip to content

Commit 5cd52c1

Browse files
20241013
1 parent 3bdbe0a commit 5cd52c1

File tree

4 files changed

+28
-48
lines changed

4 files changed

+28
-48
lines changed

_posts/2022-06-21-java.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,14 @@ Java NIO:
290290

291291
## 多线程
292292

293+
## wait() 和 sleep() 区别
294+
1. sleep() 是 Thread 的静态方法,wait() 是 Object 的普通 final 方法
295+
2. wait() 方法需要在synchronize块或者synchronize方法里调用,作用是释放锁,然而sleep不需要
296+
3. sleep() 是休眠,wait() 是挂起
297+
4. wait() 唤醒需要用 notify() 或者 notifyAll() ,而 sleep() 则是休眠一段时间自己就恢复
298+
5. 如果需要线程停顿,使用 sleep();使用 wait() 进行线程间的通信
299+
6. sleep() 必须捕获异常,而wait() 不需要捕获异常
300+
293301
### synchronized
294302

295303
1. 修饰普通方法/静态方法:通过 monitorenter 和 monitorexit 指令实现同步
@@ -491,12 +499,14 @@ JDK四种线程池:
491499
![](https://raw.githubusercontent.com/CompetitiveLin/ImageHostingService/picgo/imgs/202305171352348.png)
492500

493501

494-
线程池被回收:线程池也是在堆中也是一个对象,一定要调用shutdown
502+
线程池被回收:线程池也是在堆中也是一个对象,一定要调用shutdown()
495503

496504
线程池何时回收线程:getTask()的返回值为null时
497505
1. 未调用shutdown(),并且当前工作线程数过多
498506
2. 调用shutdown(),缓冲队列中的线程为空
499507

508+
submit() 和 execute() 的区别:submit() 内部仍然是调用 execute() 方法,只不过 submit() 方法会获取任务返回值和异常信息。
509+
500510
核心线程数设置:
501511
1. CPU密集型任务:CPU核心数 + 1:这样设置线程池的大小能实现 CPU 的最优利用率。即使当计算密集型的线程偶尔由于页缺失故障或者其他原因暂停时,这个 “额外” 的线程也能确保CPU 的时装周期不会被浪费。
502512
2. IO密集型任务:CPU核心数 * 2

_posts/2022-06-22-mysql.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ SQL的四种隔离级别:
237237

238238
## WAL 机制
239239

240-
WAL(Write-ahead logging)指 MySQL 在执行写操作时先记录在日志中,后更新到磁盘中。
240+
MySQL 保证数据不丢失: 两阶段提交 + WAL(Write-ahead logging)
241241

242-
WAL 核心:将随机写(磁盘的写操作是随机IO,耗性能)转变成顺序写和组提交机制,降低客户端延迟,提高吞吐量。
242+
WAL 核心:指 MySQL 在执行写操作时先记录在日志中,后更新到磁盘中。将随机写(磁盘的写操作是随机IO,耗性能)转变成顺序写和组提交机制,降低客户端延迟,提高吞吐量。
243243

244244
### 三大日志binlog, redolog, undolog:
245245
1. Buffer Pool是MySQL进程管理的一块内存空间,有减少磁盘IO次数的作用。

_posts/2023-08-25-kafka-vs-rocketmq.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,8 @@ RocketMQ/Kafka 使用 Consumer Group 机制,实现了传统两大消息引擎
295295

296296
## 索引机制
297297

298+
基于跳表实现
299+
298300
![](https://midkuro.github.io/images/amqp-kafka/kafka-03.png)
299301

300302
一个Topic分为多个Partition,一个Partition分为多个Segment。每个Segment对应三个文件:偏移量索引文件、时间戳索引文件、消息存储文件
@@ -307,7 +309,7 @@ RocketMQ/Kafka 使用 Consumer Group 机制,实现了传统两大消息引擎
307309

308310
### 偏移量 offset = x
309311
1. 根据偏移量索引文件名和 offset 的值,进行二分查找,找到小于 x 的最大 offset 文件
310-
2. 在该偏移量索引文件(.index)中,找到改 offset 对应的 position 位置
312+
2. 在该偏移量索引文件(.index)中,找到该 offset 对应的 position 位置
311313
3. 在消息存储文件(.log)中,找到该 position 所对应的消息内容
312314

313315

_posts/2023-09-07-note-from-work.md

Lines changed: 12 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -135,56 +135,21 @@ Kubernetes主要由以下几个核心组件组成:
135135
- Federation提供跨可用区的集群
136136
- Fluentd-elasticsearch提供集群日志采集、存储与查询
137137

138-
# 双重校验锁实现单例模式
139-
140-
```java
141-
public class Singleton {
142-
143-
private static volatile Singleton singleton = null; // volatile 必不可少,防止jvm指令重排优化
144-
145-
private Singleton() {
146-
}
147-
148-
public static Singleton getInstance(){
149-
//第一次校验singleton是否为空,为了提高代码执行效率,由于单例模式只要一次创建实例即可,所以当创建了一个实例之后,再次调用getInstance方法就不必要进入同步代码块,不用竞争锁。直接返回前面创建的实例即可。
150-
if(singleton==null){
151-
synchronized (Singleton.class){
152-
//第二次校验singleton是否为空,防止二次创建实例
153-
if(singleton==null){
154-
singleton = new Singleton();
155-
}
156-
}
157-
}
158-
return singleton;
159-
}
160-
161-
public static void main(String[] args) {
162-
for (int i = 0; i < 100; i++) {
163-
new Thread(new Runnable() {
164-
public void run() {
165-
System.out.println(Thread.currentThread().getName()+" : "+Singleton.getInstance().hashCode());
166-
}
167-
}).start();
168-
}
169-
}
170-
}
171-
```
172138

173-
# 23种设计模式与六大原则
174139

140+
# 23种设计模式与六大原则
175141

176142
## 23种设计模式
177143

178144
- 创建型
179145
1. 单例模式(Singleton)
180-
- 饿汉模式:类加载的时候就创建实例,整个程序周期都存在
181-
- 懒汉模式:只有当第一次使用的时候才创建实例,线程不安全
182-
- 双重校验锁:
183-
- 静态内部类:
146+
- 饿汉模式:类加载的时候就创建实例
147+
- 懒汉模式:只有当第一次使用的时候才创建实例
148+
- 双重校验锁:线程安全,实例需要用 `volatile` 修饰
184149
2. 原型模式(Prototype),能够复制已有对象,而又无需使代码依赖它们所属的类。例如 `Cloneable` 接口是立即可用的原型模式。
185-
3. [工厂方法模式(Factory Method)](https://refactoringguru.cn/design-patterns/factory-method/java/example),在父类中提供一个创建对象的方法, 允许子类决定实例化对象
186-
4. [抽象工厂模式(Abstract Factory)](https://refactoringguru.cn/design-patterns/abstract-factory/java/example),定义了用于创建不同产品的**接口**, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。
187-
5. [建造者模式(Builder)](https://refactoringguru.cn/design-patterns/builder/java/example),分步骤创建复杂对象。
150+
3. 工厂方法模式(Factory Method),在父类中提供一个创建对象的方法, 允许子类决定实例化对象
151+
4. 抽象工厂模式(Abstract Factory),定义了用于创建不同产品的**接口**, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。
152+
5. 建造者模式(Builder),分步骤创建复杂对象。
188153
- 行为型
189154
1. 模板方法模式(Template Method),它在基类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。
190155
2. 责任链模式(Chain of Responsibility),它让多个处理器(对象节点)按顺序处理该请求,直到其中某个处理成功为止,例如检查商品模块,需要先检查商品合法性,再检查商品可见性等等。
@@ -204,7 +169,7 @@ public class Singleton {
204169
4. 装饰模式(Decorator)
205170
5. 外观模式(Facade),为复杂系统、程序库或框架提供一个简单的接口。通常作用于整个对象子系统上。
206171
6. 享元模式(Flyweight),共享多个对象的部分状态将内存消耗最小化。
207-
7. 代理模式(Proxy)
172+
7. 代理模式(Proxy),例如动态代理
208173

209174
## 六大原则
210175

@@ -299,7 +264,7 @@ TLS 的 rsa 握手过程,存在什么安全隐患,怎么解决的?
299264

300265
#### HTTPS 绝对安全吗
301266

302-
SSL 加密是绝对安全的,但是 HTTPS 并不是绝对安全的,可以通过**中间人攻击**的方式,即所有请求先发送给第三方(中间人),返回中间人的证书,后续的请求/响应都通过中间人进行转发。
267+
NO,可以通过**中间人攻击**的方式,即所有请求先发送给第三方(中间人),返回中间人的证书,后续的请求/响应都通过中间人进行转发。
303268

304269
## HTTP版本的演变
305270

@@ -542,6 +507,9 @@ DNS 在进行区域传输的时候使用 TCP,其他情况使用 UDP。
542507
CPU 占用排查:使用 `top``top -Hp xxx` 命令定位占用率最高的进程和该进程的线程
543508
内存占用排查:`jstack``jmap` 打印出堆栈信息, `jstat` 查看垃圾回收的情况
544509

510+
- Jstat 可以查看新生代的两个S0、s1区、Eden区,以及老年代的内存使用率,还有young gc以及full gc的次数。
511+
- Jmap 可以查看当前堆中所有每个类的实例数量和内存占用,也可以 dump 内存快照,再由 VituralVM 或 MAT 软件可视化查看。
512+
545513
## Go
546514

547515
使用 pprof 工具,可以查看 CPU 占用、排查内存泄漏、协程泄漏等。

0 commit comments

Comments
 (0)