系统性能调优相关

个人自用

性能优化相关知识点-DB
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据库相关补充
hash索引 B+ tree索引 区别https://cloud.tencent.com/developer/article/2301498
Hash索引使用 https://developer.aliyun.com/article/1249086
B/B+优化索引https://www.cnblogs.com/1832921tongjieducn/p/13358264.html
https://zhuanlan.zhihu.com/p/407494800
索引命中与实效实例[https://blog.csdn.net/weixin_40849725/article/details/103287966]
(https://blog.csdn.net/weixin_40849725/article/details/103287966)
https://www.cnblogs.com/Wl55387370/p/13601894.html
https://blog.csdn.net/qiuweifan/article/details/131100993
https://www.cnblogs.com/starluke/p/11741041.html
https://juejin.cn/post/7055268489271410719
索引相关 回表以及索引下推 https://juejin.cn/post/7169023433194340383

事务&锁 https://learnku.com/articles/42715
https://zhuanlan.zhihu.com/p/149228460

mycat VS ShardingSphere https://juejin.cn/post/7124614205776330759
https://zhuanlan.zhihu.com/p/301031380
https://www.zhihu.com/question/64709787/answers/updated
https://www.zhihu.com/question/64709787
ShardingSpherehttps://zhuanlan.zhihu.com/p/425151447

主键使用UUID-雪花算法(包含主键自增相关理论)https://blog.csdn.net/weixin_42200347/article/details/128434981

微服务完整技术栈范例图
在这里插入图片描述
seata分布式事务解决方案https://blog.csdn.net/pi_tiger/article/details/131110412
#CP/AP/CAP概念
CP保持强一致性 消耗更多时间去保证其数据到位,可能造成长时间无响应

在这里插入图片描述
mq经典应用场景https://cloud.tencent.com/developer/article/1163705

缓存中间件-redis
在这里插入图片描述
三大经典问题https://xiaolincoding.com/redis/cluster/cache_problem.html#%E6%80%BB%E7%BB%93
雪崩:大面积过期
击穿:仅打破redis,数据库还是正常
穿透:两者都没有,直接打穿

补充:缓存击穿-解决 syncronized允许一个请求通过更新缓存,然后剩下的走缓存(单机/且对象全局)
-》setnx获取分布式锁

分布式锁场景:需要进行全局syncronize,只限定一个微服务能走(互斥)

全文检索ELK:原理上通过分词对元数据进行标记 key词 value 原数据标记id ,实现通过分词快速查找元数据段
在这里插入图片描述

以下自用

##JAVA基础相关

JAVA基础知识
JAVA对象头https://zhuanlan.zhihu.com/p/269720006
JAVA内存占用 https://cloud.tencent.com/developer/article/1596672
Java常用命令行工具 https://www.cnblogs.com/dennisit/p/9119535.html

JAVA集合

COLLECTION(单列集合)
List ArrayList(用的比较多 读重视) LinkedList (用的少 随机增减重视) Vector (老玩意几乎不用,线程安全,带SYN锁)
ArrayList 默认初始长度10,内部基于数组实现,强查询,弱随机增删,由于底层是数组所以是一片连续的内存空间,有的说增删时效率低,因为要整体移动位置实际上单论尾插增加元素还是效率很高的,当数组动态扩容时按位运算(2的n+1次方进行扩容) ,但是每次增加元素都会检查容量, 同时具有线程安全的JUC copyonwriteArrayList 以及Collections.synchronizedListhttps://blog.csdn.net/zljjava/article/details/48139465 总体来说copyonwrite大量写性能比syn差,但是多线程读会强于syn,是因为其读取的时候 写时复制(读写分离的思想):读取时不加锁只是写入和删除时加锁 实现机制(volatile可见 + ReentrantLock可重入锁,默认不公平可插队)copyonwrite同时在redis去fork子线程进行持久化的时候也有对应体现.读多线程时可以使用copyonwriteArraylist但是内存也会double而且在写的过程中也会出现弱一致性,直接get只会有旧值.
LinkedList 无初始长度,内部基于双向链表实现,强随机增删,弱查询,相比于arraylist来说用的内存更多,同时也有并发集合cowLinkedQueue,基本概念与cowArraylist一致
Set Hashset treeset linkedHashset
在这里插入图片描述
*
HashSet 底层由hashmap组成 无序 值唯一 可为null,多用于保存不重复的数据
LinkedHashset 底层由linkedHashmap组成 put的时候 value会成为链表数据结构中的key,而实际链表中的value则会统一赋值默认值 只能按添加顺序进行取出
Treeset 与treemap类似无添加顺序, (conparetor 进行自定义排序,默认为自然排序,树自带).只有需要进行排序的情况使用\
QUEUE DEQUE
** 并发修改异常 fast failed** 在添加元素时会有一个变量记录修改删除次数,每次迭代时会检测值,如果和原值不一样就会异常
在这里插入图片描述

MAP 双列集合
Map Hashmap LinkedHashmap treemap ConcurrentHashmap
Hashmap(重点,用的比较多,缓存多) 默认初始长度16,内部JDK1.8后数组,链表(哈希碰撞后),红黑树(避免链表过长导致的性能问题),无序(取出顺序为hash取余,这里是唯一的缺点),增删改查都快,**红黑树节点小于等于6则转回链表,链表长度大于8且数组长度大于64,则转树 **但是扩容有较大的性能损耗,当数据量超过(负载因子*现有容量,扩容后容量为2的n+1次方),扩容需要重新计算大小,计算哈希值,将内容重新放入新数组,然后转移指针到新的map对象上,
LinkedHashmap(和hashmap相比有序) 但是性能又有一定程度的损失
Treemap(二叉树映射) 实质红黑树遍历时为中序遍历,访问顺序无序,多用于需要对key进行排序的场景(conparetor 进行自定义排序,默认为自然排序,树自带)
ConcurrentHashmap 并发hashmap 线程安全 不可为null 其只给链表头加锁,增加并发量,这里使用了CAS轻量乐观锁,如果发现有修改这放弃,直到修改完成,同时在加锁计算元素个数方面,在基础计数器上新增一个数组,用于记录更新失败的数量,然后以basecount和cell的和来判断,countercell初始为2,扩容后两倍,此处扩容为多线程扩容,每个线程负责一段协同扩容,根据cpu可调用核心多少进行运算,迁移的时候keyvalue都为null,hash为-1,表示已迁移,这也是为什么插入不允许null的原因,至于为什么给头结点加锁就ok,是因为增删改都是基于头结点遍历操作的,反而作为门,卡住了其他并发问题异常
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JAVA多线程
理论
三种方式 (1)继承thread类,(2)重写runable (3)重写callable(有返回值)
(1)自定义thread 重写run方法(要执行的方法体),在目标地方new自定义类,调用start方法启动
(2)创建runable的实现类,定义run方法体,在目标地方new实现类,new一个thread对象并且把实现类作为参数传进去,start
(3) 实现callable接口 重写call方法(run()+返回值) ,在目标地方new实现类,**new 一个futuretask对象并把实现类作为参数放进来 **new一个thread对象并且把futuretask作为参数传进去,start,获取结果futuretask.get
获取当前线程 new thread ,执行currentthread方法,可获取线程名,优先级,组名
run/start区别,run()重写自start,run非syn,start为syn,run为方法体,start只是启动线程,run不产生新线程,start产生新线程,run可以执行多次,start同一个线程只能启动一次.
设置优先级,currentthread获取线程,然后setpriority 设置,10最高1最低
如何停止线程,thread.interrupt方法中断线程,执行后并没有真正中断,只是标记,可以由非静态方法thread.isinterrupeted/和静态方法Thread.interruped判断,而后者会在执行一次清除标记,所以返回一次true就又变false了,但是线程确实都停止了,同时在线程sleep的时候进行中断会发生异常
让正在执行的线程放弃执行权,Thread.yield方法,将资源占用让出
多线程中顺序执行,在后来的线程中join第一个线程,即等待第一个线程死亡
守护(后台)线程,当主线程结束守护线程也结束,用处多为资源管理,垃圾回收等,YOZOsoft也有类似机制
isAlive获取线程是否执行完毕(死亡)
syncronized 关键字 加了这个的代码块同一时间段只能一个线程执行,但是如果有数量的增减时需要进行内外双重判断数量,因为三个线程最终都会拿到锁同时不参与外层判断,会导致内部代码超过信号量(经典双重同步锁)
在这里插入图片描述
当争夺同一把锁时会阻塞,如果两边锁住的体/块不一样,则不会竞争锁
死锁:两个及以上个线程持有不同的锁,然后又去争夺对方的锁,无外力作用则会死锁(例:两个方法,定义两个锁方法(持有锁),两边互相调用两边的带锁方法(争夺锁)),sleep不释放锁
等待以及唤醒,这三个方法都只能在同步代码块中使用,syncronize(this){this.wait()},不释放锁,调用notify,notifyall唤醒单个/所有线程
wait VS sleep wait需要获取锁后才能执行(object),sleep不用(thread),wait可notify,sleep不可手动唤醒,两者都可以被interrupt,但是都会抛线程终端异常,调用sleep,期间内不会释放锁,调用wait会立刻释放锁,sleep后线程状态为timed_waiting,wait后为waiting,但是指定时间后会是timed_waiting
线程间通信(互相传锁),生产者在代码块中持有锁,然后唤醒消费者,自己释放锁(wait),消费者也在代码块持有同一种锁,唤醒对方线程后wait,其锁为传输的数据(调用方法时持有锁)
Lock显式锁如可重入锁(reentrantlock),可以显示声明Lock lock = new Reentrantlock(),lock.lock()/unlock(),自由获取锁以及释放锁,属于手动锁
非阻塞(获取不到锁时做其他事情,可以的话就走同步方法)lock.trylock可以尝试获取锁,如果true则锁可用,无需再用lock()获取锁,可以直接写个try代码块带上同步代码块,finally释放锁,返回false说明其锁不可用,则下面的另外执行,另外定义方法也可以
lock.lockinterruptible()可以在等待时被中断,当另一个线程sleep持有锁时,等待锁的一方被中断,抛出线程中断异常可处理,适用于此情况
在这里插入图片描述
Lock lock = new Reentrantlock ,lock.newCondition可获得对应对象
Condition的使用,线程通信中生产者和消费者可以都用锁new 一个自己的condition,方便管理,结果清晰,此condition定义在要传递的信息(data)里,当数据不为空,则一直让生产者等待,唤醒消费者,再wait消费者,重置数据为空,唤醒生产者循环,最后finally释放锁
Reentrantlock可重入锁(可以重复使用的同步锁),syncronized也可重入,可以在内部代码块中重复获取锁,如要实现不可重入需要实现lock接口重写lock unlock类,绑定当前线程,在unlock处判断是否为其线程,不是则直接返回,是的话unlock
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SYN VS lock 关键字/接口 ,自动 手动,按照嵌套顺序释放/可自由定义,隐/显,非公平/可非可公平,无读写/可区分读写(reentrantreadwritelock.x)
Locksupport 静态方法直接调用 lock,park/unpark实现等待与唤醒,与await signal,wait notify一样
读写锁:读锁与读锁可共享,读写,写写互斥
stampedLock(jdk1.8引入)StampedLock s = new StampedLock (),s.readlock,s.writelock,unlock,unlockRead,unlockWrite解决其他线程长期无法执行的线程饥饿问题,读读可重入,其他均不可
线程状态生命周期
在这里插入图片描述
Threadlocal 与 thread关系 threadlocal内部维护一个threadlocalmap(entry),线程内部使用,用于存储数据
可继承的theradlocal inheritblethreadlocal,在线程a中的run代码块调用启动线程B
可在线程池传递的threadlocal(阿里出品)transmitableThreadlocal
volatile(用于解决内存可见性),修饰变量,在修改与获取变量时,不经过volatile的话需要先经过(每个线程有一个)工作内存保留副本然后再修改主内存,这时有将其变量当作判断条件时,主内存已修改,另一个线程读取的是工作空间的数据副本没有被修改,于是阻塞。有volatile后程序修改后会被其他线程立刻知晓,其取得的变量也会同步修改(此处设计JMM内存模型)
举例证明 i++不是原子操作 在这里插入图片描述
此处每一步都有可能被其他线程干扰,而volatile并不能解决原子性问题(即被线程干扰后是否能正常输出正确值),多个线程i++不能通过volatile解决原子性,需要同步代码或者原子类(atomicxxx,AtomicInteger)
原子类实现理论(CAS比较交换,如果内存中的值为预期值,则交换,如果不是说明被线程干涉则不处理)
原子类常用xxxboolen,xxxintegar,可见且有原子性
CAS经典问题ABA问题A-B-A其实变了,但是cas以为没变,可以用这两个原子类,带修改标记或版本号邮戳的,可用来解决ABA问题(此处可以看到不少开源框架中数据库设计存在version,用于乐观锁判断)
在这里插入图片描述

线程池

在这里插入图片描述
阿里推荐 使用原生threadpoolExculator,其他方式有线程耗尽的风险,最好别用Excutor去创建
threadpoolExculator四个核心参数,一直存在的核心线程数,最大线程数,没有任务超过就销毁的空闲时间,还有unit指明第三个是什么单位(秒时分之类的)
当满足线程池满,无法扩容,所有线程均有任务,任务队列满,此时任务会被拒绝
创建线程池风险以下三种 fixed threadpool(核心线程数和最大线程数一样,采用的任务队列为linked阻塞队列,最大值为亿级,可能资源耗尽),singlethreadExcutor(一共只有一个线程,任务队列最大值为亿级可能资源耗尽),Cachedthreadpool(全非核心线程,最大线程数亿级,60秒销毁,队列采用同步队列)
JAVA锁机制(CAS,JUC,SYN等)
「JUC篇」之 一篇文章掌握synchronized与锁升级https://juejin.cn/post/7196519653266292797
java–JUC快速入门(彻底搞懂JUC) https://blog.csdn.net/weixin_43888181/article/details/116546374

JVM模型&性能调优
JVM参数调整(常用)https://zhuanlan.zhihu.com/p/519246649
参数(全)https://blog.csdn.net/guyue35/article/details/107957859
JVM双亲委派机制详解 https://zhuanlan.zhihu.com/p/269214344
深入理解JVM中类加载、类加载器https://blog.csdn.net/mocas_wang/article/details/107927451

JVM垃圾回收机制&算法
JVM-剖析对象内存分配流程 https://artisan.blog.csdn.net/article/details/106977301?spm=a2c6h.12873639.article-detail.7.443f10385VNSJs
GC 各垃圾回收算法https://cloud.tencent.com/developer/article/1698772
https://zhuanlan.zhihu.com/p/347245583
ZGC&CMS&G1 https://javabetter.cn/jvm/gc-collector.html
CMS 并行标记清除算法https://zhuanlan.zhihu.com/p/340530051
CMS和G1的漏标问题解决及三色标记算法图解
三色标记的漏标问题及两种解决方案 https://blog.csdn.net/qq_32310175/article/details/107724213
Jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码https://zhuanlan.zhihu.com/p/286110609
垃圾回收中的安全点与安全区域https://blog.csdn.net/u010502101/article/details/120030517
JDK 8 到底默认用的是哪款 GC 收集器?https://blog.csdn.net/youanyyou/article/details/106464291

在这里插入图片描述
JAVA 内存泄漏&java内存溢出(OOM)
https://blog.csdn.net/m0_37723088/article/details/129842357
https://zhuanlan.zhihu.com/p/79355050
Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子https://zhuanlan.zhihu.com/p/103274367

JAVA项目线上异常排查
CPU使用率过高问题排查及Linux之top命令用法详解https://blog.csdn.net/xianyu120/article/details/125178147
如果线上遇到了OOM,你该如何排查https://blog.csdn.net/o9109003234/article/details/121917786

##Spring家族&MYBATIS(PLUS) 相关

Spring 基础
Bean的生命周期(不要背了记思想)https://cloud.tencent.com/developer/article/2184201
Spring源码-单例池/单例模式,看这一篇就够了 https://blog.csdn.net/qq_56674917/article/details/131684032
一文带你深入理解SpringBean生命周期之PostConstruct、PreDestroy详解https://juejin.cn/post/7111258070352658446
Spring之推断构造方法 https://developer.aliyun.com/article/1353328
Spring的@Autowired是先bytype还是先byname https://blog.csdn.net/cmj962464/article/details/116548890
Spring的自动装配 byName和byType的区别 https://blog.csdn.net/jiguquan3839/article/details/89416203
【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)https://blog.csdn.net/qq_15037231/article/details/105938673
面试官:Spring的Bean实例化过程应该是怎样的?https://zhuanlan.zhihu.com/p/368720644
SpringBean生成流程详解 —— 由浅入深(附超精细流程图)
springAOP,spring事务 基于AOP实现,都遵循需要进行代理对象传入来防止AOP失效
在这里插入图片描述
一文带你彻底搞懂SpringAOP底层原理!https://zhuanlan.zhihu.com/p/373676597
死磕 Spring 之 AOP 篇,带你全解 Spring 事务https://zhuanlan.zhihu.com/p/371984078
结合ThreadLocal来看spring事务源码,感受下清泉般的洗涤! https://www.cnblogs.com/youzhibing/p/6690341.html

Spring MVC 相关

Spring Boot 相关

MYBATIS 相关

##MYSQL&POSTGRESQL 关系型数据库相关

Mysql VS PostgreSQL

事务

索引相关
Java面试题篇·MySQL索引连环18问!(面试必备八股文)https://www.jianshu.com/p/5f864ec1257e
java Mysql 面试题,原理,索引,优化----持续补充https://blog.csdn.net/grd_java/article/details/123139340

MVCC 多版本并发特性
MySQL 的多版本并发控制 (MVCC)https://zhuanlan.zhihu.com/p/272696187

SQL优化
SQL优化最干货总结https://zhuanlan.zhihu.com/p/265852739
SQL优化2023版最新干货总结 - MySQLhttps://blog.csdn.net/le9528/article/details/130287167

数据库配置调优
Mysql 配置性能调优参数设置详解 https://blog.csdn.net/weixin_43944102/article/details/103899399

##SpringCloud & 微服务理念及组件选型

理论相关
CAP理论
BASE理论

注册中心(主 NACOS

配置中心 (主 APOLLO
理论相关
暴露8070 8080 元数据中心 注册中心 配置服务 8090 restapi
8080 app请求 元数据服务 返回元数据(基本写为程序连接的url+端口)以及放置配置的地址 app再使用其地址到配置服务取配置
8090 对外提供管理接口 可以修改配置,多种环境(dev 测试 灰度),管理权限,监控预警
8070 webGUI 可在页面上手动操作信息
创建后初始化两个db(configDB 配置信息,portal 权限管理等页面信息)
在这里插入图片描述
从apollo取出对应内容动态赋值
@类中写入@refreshscope 可以进行实时监听修改配置

Apollo配置中心使用篇 https://blog.csdn.net/m0_53157173/article/details/130086378
API网关(主 GATEWAY)
理论相关

核心概念
Spring Cloud Gateway入门demo [https://www.cnblogs.com/dabenxiang/p/13778128.html]
(https://www.cnblogs.com/dabenxiang/p/13778128.html)
Gateway网关(二)路由、 断言、 过滤和实战+源码https://blog.csdn.net/weixin_45921762/article/details/107131499
负载均衡 (主 LoadBalancer ribbon已死 )
(不知)
故障容错&流量控制 (主 Sentinal)

链路追踪(ZIPKIN?SKYXXX?)
没用,只用ELK了
分布式事务(主 Seata)
【面试普通人VS高手系列】谈谈你对Seata的理解 https://zhuanlan.zhihu.com/p/494461294
三年开发面试题!谈谈你对Seata的理解 https://cloud.tencent.com/developer/article/2310888
分布式事务高频面试题(2022最新,建议收藏!)https://zhuanlan.zhihu.com/p/582050037

远程调用(主Dubbo feign已死)
【2022最新Java面试宝典】—— Dubbo面试题(47道含答案)https://blog.csdn.net/qq_30999361/article/details/124637288
史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!https://blog.csdn.net/qq_30999361/article/details/124637288
理论相关
dubbo服务提供者接口
1.获取类加载器(关联双亲委派机制,控制加载顺序)
2.在缓存map中寻找对应需要寻找的类,如果有则直接加载
3.没有的话可以由@SPI"xxx"注解去注册到dubbo的map中去(key为SPI的内容,value为全限定类名),通过类加载器加载类并将keyvalue放到map缓存中去,加载到dubbo的容器中
为什么dubbo不用JDK自带的服务提供者接口?
java需要加载所有符合初始化条件的类,且没有缓存机制,每次使用需要重新加载,造成初始化效率低
dubbo的可以通过对应的名字按需加载,还能分版本,有缓存,重复加载时加速,有IOCAOP的支持,并支持扩展
dubbo服务暴露(服务方进行暴露)
uri: 协议:密码@主机名:端口/路径?key1=value1&key2=value2
然后将url注册到注册中心,使得消费者可以获取服务提供方信息,屏蔽底层复杂内容(如dubbo封装的netty框架)
1.先检测当前配置信息,配置为空(缓存)则进行创建
2.根据URL创建动态代理的类,并将URL实现为explorter
3.如果只是本地进行暴露,指消费和提供都在同机子,则将其存入缓存map中
4.如果要进行远程暴露,通过注册协议进行export,获取注册中心相关配置,在ProviderConsumerRegTable(concurrentHashmap,key是全限定类名,value是set包含的invoker)记录invoker,打开server用netty监听服务.
dubbo消费方进行引入
1.饿汉式,服务一启动就会引入,直接调用ReferenceBean的afterPropertiesSet方法引入(IOC的一环)
1…懒汉(按需引入,默认为此方法,达到资源合理利用
2.本地引入走injvm协议,到服务提供方的缓存中获取exporter,不走RPC
2.点对点远程引入服务,不经过注册中心,consumer直接调用provider地址进行直连
2.通过注册中心引入远程服务,Consumer通过注册中心获取提供方相关信息(URL),进行服务的引入
总:先通过配置信息构建一个map,然后利用map构建对应的URL(带有全部信息),调用对应的协议应用得到对应的invoker,然后构建代理方式,封装invoker返回服务引用,知乎消费方根据invoker上的信息对代理类进行调用
dubbo服务调用过程(提供方暴露方法,消费方引入方法并调用)
1.先生成一个invoker封装对应的代理细节(URL) ,然后cluster通过路由以及负载均衡机制选择一个invoker进行远程调用,记录请求和ID并等待响应
2.服务提供方收到请求后找到之前暴露服务时存的mao得到对应的exporter(exporter->invoker->impl实现类),调用实现类组装结果进行返回并携带请求的ID
3.消费方通过ID找到之前提供的请求,将响应放入对应的Futuretask中,唤醒线程以得到对应的响应
实战demo
1.引入dubbo,zk依赖
2.配置dubbo,zk地址以及协议等
3.抽象出服务接口,在实现类(服务提供方)上加注解@dubboservice(原springboot为service注解)
4.main方法添加@EnableDubbo
5.服务消费方引入dubbo,加上@dubboRefrence

##消息中间件

理论相关

Kafka
20道经典的Kafka面试题详解 https://www.jianshu.com/p/511962462e58
Kafka最新面试题及答案汇总(2022版)https://zhuanlan.zhihu.com/p/469002514
2023年最新kafka常见面试题https://zhuanlan.zhihu.com/p/612085419

IBM MQ
在这里插入图片描述

选型问题
RabbitMQ、Kafka、RocketMQ正确选型姿势【消息中间件篇】https://zhuanlan.zhihu.com/p/94661785
超赞,大神总结的主流消息中间件技术选型对比与参考https://cloud.tencent.com/developer/article/1876155
实际运用

##NoSQL & ES

理论相关

Redis
【精选】30+Redis面试题整理(2024)附答案https://blog.csdn.net/HO1_K/article/details/136394137
3 万字 + 40 张图 | Redis 常见面试题(2023 版本) https://cloud.tencent.com/developer/article/2315477
Elasticsearch

ELK 日志平台框架

实际运用

##设计模式相关

理论相关(此处可大量结合spring源码实现进行引出)
创建模式
单例 (饿汉(初始化即调用,对cpu与内存资源抢占,声明static 直接调用),懒汉(延迟调用 声明static 但是一开始指向null)) 确保一个类最多只有一个实例,并提供一个全局访问点 关联spring bean单例模式 getBean <空间换时间 cache理论>,,懒汉资源可控但是会有线程风险(因为实例化和声明不是一起的),此时可以使用volatile禁止指令重排序,然后在实例化前判断其对象是否存在的部分增加syncronized关键字
****工厂(简单工厂 工厂方法 抽象工厂 )
生成器 builder 封装内部复杂的构建过程 导演类内写指导组装方法,抽象builder内写通用抽象方法,然后实际组装时每一个都写一个方法。便于控制真个对象的生产过程,并封装,与工厂一键生成不同
原型 复制现有的实力以创建新的实例(此处关联浅拷贝和深拷贝,浅拷贝为基础数据类型全复制,引用类型则引用,重写Object的clone方法(super.clone()),且这里主要是作深拷贝)
结构型模式
适配器 adapter 用于解决兼容性问题(有类的接口的以及接口的适配器)
在这里插入图片描述
装饰者(动态将新功能加到对象上,扩展对象功能)
在这里插入图片描述
代理模式(此处关联springAOP,事务等)起到中介进行代理对象与原对象隔离的作用,另外符合开闭原则,增加对应的功能,(分为静态代理(代价太大不易改造难维护弃用),JDK动态代理,cglib动态代理)
JDK动态代理 Java.lang.reflect.Proxy生成实例
CGLIB动态代理 效率比动态代理高,非final的方法都可以进行代理,动态生成一个代理子类,重写非final方法,编织入需要增强的逻辑然后用代理对象进行执行(必须引用代理对象才有用)
Spring 中的 AOP,有接口就用 JDK 动态代理,没有接口就用 Cglib 动态代理。
Spring Boot 中的 AOP,2.0 之前和 Spring 一样;2.0 之后首选 Cglib 动态代理,如果用户想要使用 JDK 动态代理,需要 自己手动配置。

外观模式 (简单易用,无需知道内部复杂逻辑)
客户端调用facade外观类然后外观类去调用子系统实现逻辑

桥接 ( 将抽象部分与它的实现部分分离,使它们都可以独立地变化)当系统需要分成两大块单独变化的时候(比如手机/手机软件大类)两个维度进行扩展

组合模式 (部分-整体模式)(希望客户可以忽略单体与复杂的部分,无差别使用)

享元模式 (通过共享的方式高效的支持大量细粒度的对象。减少消耗内存,解耦)
比如在创建一个String的时候,会先去字符串缓存池里面寻找,没有才创建
个人的时候可以使用hashmap进行存储保证key唯一,比如单例bean的concurrentHashmap内部实现

关系型模式
父子类(策略,模板)
策略模式 (解决 使用 if…else 所带来的复杂和难以维护。)

模板模式
父类定义整体框架流程抽象方法,之类集成后重写真实方法,优点是不会改变整体结构
多个之类继承流程抽象方法

观察者模式
当一个对象状态改变时,依赖的类将被得到通知并做出一定动作
用一个list存观察者,当被观测者发生变化则通知观察者(遍历集合调用其内部变化方法)

单例
深入解析单例模式:原理、应用与实践https://developer.baidu.com/article/details/2786770
独一无二,掌控全局:揭秘单例模式的魅力https://bbs.huaweicloud.com/blogs/424056

工厂

模板
设计模式系列1 - 模板模式&策略模式 https://zhuanlan.zhihu.com/p/369485924
Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式 https://www.cnblogs.com/xuwujing/p/9954263.html

策略

享元

其他

实际运用(框架中的运用,特性,经典运用场景)

##单元测试相关

理论

Junit

Mockito

##Linux&Docker命令 运维相关

理论

Linux相关

Docker相关
干货 | 熟背这些docker常用命令,面试不用愁!https://zhuanlan.zhihu.com/p/410708004
Docker常见面试题汇总(持续更新中…)https://blog.csdn.net/ANobility/article/details/129750921
Top 20 Docker 面试题(附答案)https://blog.csdn.net/shanghongshen/article/details/121603303

K8s
云原生:K8s(Kubernetes)高频典型面试题汇总 https://zhuanlan.zhihu.com/p/468015679
超全整理——128道kubenetes高频面试题汇总(带答案)https://zhuanlan.zhihu.com/p/480778731
最新 2023 年云原生Kubernetes 高级面试题大全(持续更新中)https://blog.csdn.net/qq_46654855/article/details/125612617
50 个你必须掌握的 Kubernetes 面试题https://cloud.tencent.com/developer/article/1476010

##GIT&SVN JIRA&FISHEYE&CONFLUENCE等

GIT

SVN

FISHEYE

CONFLUENCE

##前端相关

HTML

CSS

JS

VUE

## Devops相关

理论相关

CI

CD

GITLAB RUNNER
Gitlab runner 部署流程视频https://www.bilibili.com/video/BV18y4y1S7VC
gitlabrunner 部署流程文档 http://docs.idevops.site/gitlabci/chapter02/01/1-2-gitlabrunner%E5%AE%89%E8%A3%85/

##项目相关

项目1

项目2

##难点 问题点 可以说的点

ISO8583 EBCBIC转码 曲折分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值