Skip to content

Commit f43e84a

Browse files
20240903
1 parent e9f1134 commit f43e84a

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

_posts/2023-08-11-springboot.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ IOC的实现原理是工厂模式加反射机制。
5858

5959

6060
[三级缓存解决循环依赖](https://developer.aliyun.com/article/766880)
61-
- 前提,出现循环依赖的Bean必须是单例;依赖注入的方式不能全是构造器注入(全是构造器注入则无法解决循环依赖)。
61+
- 前提,出现循环依赖的Bean必须是单例;依赖注入的方式不能全是构造器注入(通过setter方法进行依赖注入,全是构造器注入则无法解决循环依赖)。
6262
- getSingleton(beanName)方法三级缓存
6363
1. singletonObjects,一级缓存,存储的是所有创建好了的**单例Bean对象**
6464
2. earlySingletonObjects,二级缓存,完成实例化,但是还未进行属性注入及初始化的**提前暴露的对象**
@@ -145,4 +145,11 @@ PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的区别:
145145

146146
结论:
147147
1. transactional注解修饰的方法会创建一个代理增强类,其他方法调用该注解修饰的方法也只是调用原类中的方法。
148-
2. transactional修饰的方法内报错就一定会回滚。
148+
2. transactional修饰的方法内报错就一定会回滚。
149+
150+
# Spring 用到了哪些设计模式
151+
1. 普通工厂模式:通过 BeanFactory 和 ApplicationContext 容器创建 Bean 对象
152+
2. 代理模式:AOP 的实现
153+
3. 单例模式:Bean 默认是单例
154+
4. 模板方法:jdbcTemplate 等用到了模板方法
155+
5. 观察者模式:Springboot 事件驱动,监听器等

_posts/2024-02-27-go.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,30 @@ func main() {
256256
- 数组在内存中是一段连续的内存空间,元素的类型和长度都是固定的;
257257
- 切片在内存中由一个指向底层数组的指针、长度和容量组成的,长度表示当前包含的元素个数,容量表示切片可以拓展的最大元素个数。切片 `s[x: y]` 表示 `s` 中第 `x` 位到第 `y - 1` 位元素截取。
258258

259-
## 协程
259+
## 协程/线程/进程的区别
260260

261-
简单理解:用户态的线程,上下文切换通过调用方去控制,而不是操作系统
261+
- 进程:是具有一定独立功能的程序,是系统资源分配和调度的最小单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全
262262

263-
好处:减少了线程的重复高频创建;尽量避免线程的阻塞;
263+
- 线程:是进程的一个实体,是内核态,而且是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
264264

265-
和线程的对比:协程更适合于IO密集型应用程序,如网络编程、爬虫等。而对于CPU密集型应用程序,线程仍然是更好的选择。
265+
- 协程:是一种用户态的轻量级线程,调度完全是由用户来控制的拥有自己的寄存器上下文和栈。调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。一个线程可以有多个协程,线程、进程都是同步机制,但协程是异步
266266

267267

268+
269+
## Go 和 Java 的区别
270+
271+
1. 语言特性:
272+
- Java 面向对象,静态语言,有完整的继承体系,不支持多继承,值传递
273+
- Go 虽然是静态类型语言,但具有动态类型语言的**鸭子类型**(基于 interface 实现),支持多继承,值传递
274+
275+
2. 并发模型:
276+
- Java 的并发基于线程和锁
277+
- Go 的并发基于协程和通道,可以实现轻量级的并发
278+
279+
3. 性能
280+
- Java 需要通过虚拟机,可跨平台,从字节码编译成机器码
281+
- Go 的效率高,因为没有虚拟机,直接编译成机器码
282+
268283
## Byte 和 Rune 类型
269284

270285
- byte是uint8的别称,一个值就是一个ASICII码的值,占 1 个字节的英文类字符,使用 byte

0 commit comments

Comments
 (0)