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:
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类,两者都是可重入锁、悲观锁、独占
5785782 . 共享式。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
Original file line number Diff line number Diff 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主节点可以读、写,从节点只能读
You can’t perform that action at this time.
0 commit comments