File tree Expand file tree Collapse file tree 2 files changed +28
-12
lines changed Expand file tree Collapse file tree 2 files changed +28
-12
lines changed Original file line number Diff line number Diff line change @@ -313,8 +313,8 @@ Java NIO:
313
313
314
314
### synchronized
315
315
316
- 1 . 修饰普通方法/静态方法:通过 monitorenter 和 monitorexit 指令实现同步
317
- 2 . 修饰代码块:通过 ACC_SYNCHRONIZED 标记符实现同步
316
+ 1 . 修饰普通方法/静态方法:通过 Access flags 的标记符实现同步
317
+ 2 . 修饰代码块:通过 monitorenter 和 monitorexit 指令实现同步
318
318
319
319
底层都是通过对象头里 Mark Word 指向的对象监听器(Monitor)实现的,再底层是操作系统的互斥量(mutex)实现的
320
320
@@ -578,11 +578,26 @@ ReentrantLock:继承了Lock类,两者都是可重入锁、悲观锁、独占
578
578
2 . 共享式。ReentrantWriteLock 和 CountDownLatch 是共享锁模式。CountDownLatch 会将任务分成 N 个子任务,初始化 state = N,每个子线程完成任务后会减一,直到为零。
579
579
580
580
581
- Contract接口模式,结合feign实现
582
- - contract 用于暴露接口
583
- - service 用于实现接口
581
+ ## 锁消除
584
582
583
+ 指Java虚拟机在即时编译时,通过对运行上下的扫描,消除那些不可能存在共享资源竞争的锁。锁消除可以节约无意义的请求锁时间。
585
584
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
+ ```
586
601
587
602
接口和抽象类的区别:
588
603
Original file line number Diff line number Diff line change @@ -152,11 +152,17 @@ Redis 7之后使用 Listpack(紧凑列表) 数据结构代替 Ziplist。
152
152
153
153
# 单线程与多线程
154
154
155
- redis 4.0 后部分命令开始使用多线程。
156
-
157
155
为什么使用单线程?
158
156
- Redis 的瓶颈是内存和带宽,而不是 CPU。
159
157
158
+
159
+ 为什么又引入了多线程?
160
+ - redis 4.0 开始使用多线程惰性删除。
161
+ - redis 6.0 中多线程的实现主要集中在网络 I/O 处理上。采用了混合多线程模型,即在网络 I/O 处理阶段使用多线程。只能执行同时读或同时写
162
+
163
+ 在命令执行阶段仍然采用单线程。这种设计既保留了单线程模型的简单性和一致性优势,又充分利用了多线程的并行处理能力。
164
+
165
+
160
166
[ 什么是多路IO复用] ( https://juejin.cn/post/7015927248100261901 ) :一个服务端进程可以同时处理多个客户端连接。用于AOF持久化任务和处理客户端请求。其实现函数有:
161
167
- select:数据结构是bitmap,采用轮询,限制连接数为1024个(最大文件描述符数量)
162
168
- poll:数据结构是数组,解决了select的个数限制,但依旧是轮询
@@ -166,11 +172,6 @@ redis 4.0 后部分命令开始使用多线程。
166
172
167
173
168
174
169
-
170
- 为什么 Redis 又支持多线程了?
171
- - 使用多线程仅在部分非阻塞的删除操作上面,通过多线程非阻塞释放内存,减少对主线程的阻塞,提高执行效率。
172
-
173
-
174
175
# 高可用(主从,哨兵,集群)
175
176
## 主从模式
176
177
主节点可以读、写,从节点只能读
You can’t perform that action at this time.
0 commit comments