Skip to content

Commit 6692342

Browse files
20241203
1 parent 0f7edc7 commit 6692342

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

_posts/2022-06-21-java.md

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,8 +313,8 @@ Java NIO:
313313

314314
### synchronized
315315

316-
1. 修饰普通方法/静态方法:通过 monitorenter 和 monitorexit 指令实现同步
317-
2. 修饰代码块:通过 ACC_SYNCHRONIZED 标记符实现同步
316+
1. 修饰普通方法/静态方法:通过 Access flags 的标记符实现同步
317+
2. 修饰代码块:通过 monitorenter 和 monitorexit 指令实现同步
318318

319319
底层都是通过对象头里 Mark Word 指向的对象监听器(Monitor)实现的,再底层是操作系统的互斥量(mutex)实现的
320320

@@ -578,11 +578,26 @@ ReentrantLock:继承了Lock类,两者都是可重入锁、悲观锁、独占
578578
2. 共享式。ReentrantWriteLock 和 CountDownLatch 是共享锁模式。CountDownLatch 会将任务分成 N 个子任务,初始化 state = N,每个子线程完成任务后会减一,直到为零。
579579

580580

581-
Contract接口模式,结合feign实现
582-
- contract 用于暴露接口
583-
- service 用于实现接口
581+
## 锁消除
584582

583+
指Java虚拟机在即时编译时,通过对运行上下的扫描,消除那些不可能存在共享资源竞争的锁。锁消除可以节约无意义的请求锁时间。
585584

585+
## 锁粗化
586+
587+
一直对某个对象反复加锁和解锁,频繁地进行互斥同步操作也会引起不必要的性能消耗。如果虚拟机检测到有一系列操作都是对某个对象反复加锁和解锁,会将加锁同步的范围粗化到整个操作序列的外部。
588+
589+
```
590+
//==== 粗化前 ===
591+
for(int i=0;i<n;i++){
592+
synchronized(lock){
593+
}
594+
}
595+
//==== 粗化后 ===
596+
synchronized(lock){
597+
for(int i=0;i<n;i++){
598+
}
599+
}
600+
```
586601

587602
接口和抽象类的区别:
588603

_posts/2023-07-06-redis.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,17 @@ Redis 7之后使用 Listpack(紧凑列表) 数据结构代替 Ziplist。
152152

153153
# 单线程与多线程
154154

155-
redis 4.0 后部分命令开始使用多线程。
156-
157155
为什么使用单线程?
158156
- Redis 的瓶颈是内存和带宽,而不是 CPU。
159157

158+
159+
为什么又引入了多线程?
160+
- redis 4.0 开始使用多线程惰性删除。
161+
- redis 6.0 中多线程的实现主要集中在网络 I/O 处理上。采用了混合多线程模型,即在网络 I/O 处理阶段使用多线程。只能执行同时读或同时写
162+
163+
在命令执行阶段仍然采用单线程。这种设计既保留了单线程模型的简单性和一致性优势,又充分利用了多线程的并行处理能力。
164+
165+
160166
[什么是多路IO复用](https://juejin.cn/post/7015927248100261901):一个服务端进程可以同时处理多个客户端连接。用于AOF持久化任务和处理客户端请求。其实现函数有:
161167
- select:数据结构是bitmap,采用轮询,限制连接数为1024个(最大文件描述符数量)
162168
- poll:数据结构是数组,解决了select的个数限制,但依旧是轮询
@@ -166,11 +172,6 @@ redis 4.0 后部分命令开始使用多线程。
166172

167173

168174

169-
170-
为什么 Redis 又支持多线程了?
171-
- 使用多线程仅在部分非阻塞的删除操作上面,通过多线程非阻塞释放内存,减少对主线程的阻塞,提高执行效率。
172-
173-
174175
# 高可用(主从,哨兵,集群)
175176
## 主从模式
176177
主节点可以读、写,从节点只能读

0 commit comments

Comments
 (0)