简单了解策略模式
什么是策略模式?策略模式提供生成某一种产品的不同方式
Strategy策略类定义了某个各种算法的公共方法,不同的算法类通过继承Strategy策略类,实现自己的算法
Context的作用是减少客户端和Strategy策略类之间的耦合,客户端只需要调用Context并且传递相应的算法参数,来调用不同的算法,Context的内部实现可以用一个Map<id, Strategy>,在Spring启动的时候,会把Strategy类自动装配进Map
Spring的策略模式Resource getResource(String location) 根据传入的 location(算法参数)返回一个资源子类(具体算法),如 ClassPathResource 内部定义了解析 xml 的方法
1234567891011121314else if (location.startsWith(CLASSPATH_URL_PREFIX)) { return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.le ...
简单了解观察者模式(发布 - 订阅模式)
什么是观察者模式?观察者根据主题类的内部状态变化来改变自身状态,简单来说就是观察者订阅了主题类,当主题类发布一些消息,观察者就会收到消息,然后做出反应。
Spring的观察者模式Spring用了监听器(观察者)来完成观察者模式,有两种方式:
通过实现ApplicationListener
或者使用注解@EventListener来完成事件监听
ApplicationContext底层用SimpleApplicationEventMulticaster发布事件(主题类内部状态变化)的时候,会同步通知这些监听器(如果设置了线程池则异步发送),监听器如果发现自己感兴趣的消息,就会进行相应的处理。
简单了解HTTP和HTTPS
HTTP的安全问题?我们都知道HTTP是不安全的,而HTTPS是安全的,那HTTP有哪些安全问题呢?(考虑传输过程以及响应方)
明文传输,有窃听风险:HTTP协议无法加密数据,所有通信数据都在网络中明文传输,通过网络的嗅探设备及一些技术手段,就可轻易窃听并还原HTTP报文内容。
无法验证数据完整性,有篡改风险:HTTP协议无法证明通信的报文完整性,发送方发出的请求和接收方接收到的响应是前后相同的,没有被篡改的。
无法验证通信方身份,有冒充风险:在请求或响应到达接收方这段时间内,请求或响应被第三方拦截伪造之后再次发出,通信双方也无法知晓。
HTTPS如何解决的?
混合加密明文解决窃听风险
摘要算法为数据生成一个唯一的指纹,通过指纹验证报文完整性,解决篡改风险
将服务器公钥放入到数字证书中,并把证书注册到CA,解决了冒充风险。
混合加密HTTPS采用了非对称加密和对称加密结合的方式:
TLS握手期间采用非对称加密交换交换随机数生成会话密钥
此后的通信过程采用对称加密的会话密钥进行加密
为什么用混合加密?对称加密虽然加密、解密的运算速度快,但是如果在HTTP明文传输密钥,那密钥可能 ...
LeetCode
回溯回溯的本质是穷举,列出所有的组合,从中找到符合的答案。
回溯的模板每次递归都是为了找到路径的其中一个组成节点,符合条件的路径就是其中一个答案。
123456789101112void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 }}
for循环的开始下标是0还是startIndex一般情况下都是0,主要考虑什么时候是startIndex:
当数组有序,这一层选了某个数字之后,下一层不能选更小的数字,比如大部分组合问题
字符串,这一层选了某个子串,下一层要从后一个索引位置开始,比如切割问题
去重树层去重一般用到used[]数组都是全局的,可用于数层或者树枝;
有时候也可以放backTracking内部,只用于本树 ...
TCP可靠传输和UDP实现可靠传输
为什么有了TCP还要QUIC?我们知道TCP可以支持可靠传输,但是为什么还需要基于UDP在应用层再实现一个可靠传输的QUIC协议?QUIC协议在HTTP3被使用,为了解决HTTP2的TCP队头阻塞的问题(当某个TCP分片丢失,后续的TCP分片都无法被确认)、TCP握手的时延问题、一方更换IP需要重新建立连接等问题,将传输层协议由TCP改成了UDP,但是UDP是不保证报文段可以到达对方的,只是尽最大努力交付,而下层的IP协议也是不可靠的,我们只好在应用层实现一个可靠的协议,也就是QUIC协议。
QUIC协议如何实现?那么TCP主要干了两件事情,一个是让乱序的包有序(这样可以知道哪些包丢失了)、一个是包重传和流量、拥塞控制。
QUIC Frame Header先来看看为什么包会乱序,也可以说是HTTP请求乱序?一开始的TCP连接并没有实现HTTP并行,也就是必须要等到上一个HTTP的请求收到响应之后才能发出下一个HTTP请求这种一问一答的形式,后面增加了滑动窗口这个机制(在内核实现一个缓存),让HTTP可以在窗口大小的范围内实现并发,每个HTTP请求都对应有发出的顺序(也就是seq序列号) ...
refresh()发生了什么
什么是refresh()?refresh()相信对于阅读过Spring源码的朋友并不陌生,ApplicationContext的自动装配功能正是通过这个函数完成的,其中有一些重要的子方法,如注册BeanFactoryPostprocessor、注册BeanPostprocessor、注册EventListener监听事件、提前完成非懒加载的bean的实例化。
refresh()在内部使用了一个对象锁保证线程安全,只能由一个线程进行自动装配或者是销毁。
// 在Spring的低版本只能通过xml加载创建bean,为了适配注解的方式,AnnotationConfigApplicationContext在refresh()之前完成一些事情来实现
refresh()的12步骤1.prepareRefresh()准备此上下文以进行刷新,修改了active = true表明当前正在进行的是创建过程。
初始化属性、初始化环境变量
2.obtainFreshBeanFactory()⭐告诉子类刷新内部 Bean 工厂,对于xml方式,在这里加载xml文件的BeanDefi ...
简单了解硬中断和软中断
什么是中断?中断是硬件设备发出请求的一种方式,当计算机收到硬件的请求之后,会暂停当前处理的任务,转而调用内核的中断处理程序响应硬件的请求。要求中断处理程序尽可能快的执行完,否则会影响原本程序的执行,在中断处理的时候还可能会临时关闭中断,导致无法响应其它硬件的请求。
中断是一种异步的请求方式,在发生中断之前,CPU可以正常的执行程序。
如何让中断能尽快执行完成?将中断拆分成两部分:
硬中断:快速响应硬件发出的中断请求
软中断:在内核线程继续完成硬中断的任务
比如网卡在接收数据包的时候,先通过DMA将数据包写入内核缓存,再硬件中断通知CPU把数据包传递给对应的进程,临时关闭中断,避免影响内核的效率,硬中断的任务就完成了,接下来内核触发软中断,执行软中断处理程序,把数据包从内核缓存找到,再逐步拆解头部信息,把数据包交给对应的应用程序。
总结硬中断是硬件发出的请求,会打断CPU正在执行的程序,执行速度很快
软中断在硬中断之后,交由内核线程继续完成硬中断的后续任务
简单了解GC垃圾回收
什么是垃圾回收一般在内存不足的时候,JVM会发生垃圾回收释放掉一些无用的内存,那么哪些是无用的内存:
数据存放的区域来说运行时数据区里面被分成很多部分,我们一般关注的就是堆和方法区(这里也是内存变动较大的区域),对于程序计数器、栈等区域,我们一般认为内存大小在创建的时候就已经确定了(除了编译器的一些优化,不过无关紧要)。
存放的数据来说堆中存放着大量对象:
死亡的对象:没有被引用到的对象
而方法区常量池中存放着常量和类的元信息:
废弃的常量:没有被引用到的常量,如串池的一些字符串常量
废弃的类:
该类所有对象实例都被回收
该类的类加载器ClassLoader被回收
该类的Class对象没有被引用,比如没有用反射方法
如何判断对象死亡以及四种引用类型如何判断对象死亡判断死亡对象一般有两种方式:
循环计数算法:在对象内部增加一个引用计数器,当被局部变量引用一次,计数器加一;当方法结束栈销毁的时候计数器就会减一,但是可能会出现循环引用导致两个对象都无法被正确的回收
可达性分析算法:从GC Root开始遍历,无法到达的对象都被判定为死亡对象,需要被垃圾回收
可达性分析算法详解什么是GC R ...
简单了解synchronized
什么是synchronizedsynchronized是Java提供的一个关键字,用于方法或者代码块,保证并发安全。
synchronized使用场景同步代码块(原子性)synchronized可以用在方法上,或者用在代码块。
可锁的对象可以是普通对象,或者是类(也就是Class对象)。
12345678910111213public class SynchronizedTest { static final Object monitor = new Object(); public static void main(String[] args) { synchronized (monitor) { System.out.println("对象锁同步代码块访问"); } synchronized (SynchronizedTest.class) { System.out.println("类锁同步代码块访问&q ...
简单了解原型模式
什么是原型模式区别于单例模式,原型模式的一个类可以有多个实例化的对象。
原型模式通过拷贝来产生新的对象,而不是new,并且可以根据自己的需求修改对象的属性。
实现Cloneable接口实现拷贝而拷贝又分为浅拷贝和深拷贝,两者在基本字段的拷贝没有区别,主要区别在于引用字段的拷贝
浅拷贝调用super.clone()完成拷贝,不拷贝引用类型对象,也就是两个引用的字段都指向同一个对象
深拷贝可以重新clone()完成拷贝,自己新建一个引用类型对象,让两个引用的字段都指向不同的对象