- 博客(25)
- 收藏
- 关注

原创 从0开始手撕rpc
使用"微内核+可插拔"架构,通过自定义SPI加载机制,支持缓存,动态替代扩展点组件灵活使用设计模式来提高系统可扩展性,如单例模式、工厂模式、建造者模式实现服务调用负载均衡机制,支持轮询、随机、一致性哈希算法,优化调用体验通过自定义通信协议、支持多种序列化方式,同时实现Gzip压缩,提高网络传输效率。实现自定义request - response模型,在异步通信条件下确保消息的请求和响应成功基于自定义starter实现,优化SpringBoot环境下的使用。
2024-09-22 14:08:09
1002
原创 深入浅出,从源码搞清Bean的加载过程
创建Spring容器读取配置(或者注解),解析内容,封装到BeanDefinition的实现类中(通过registerBeanDefiniton方法来注册到ConcurrentHashMap中,然后将beanName放到list中方便取出)实例化Bean放到Spring容器中至于一些实例化之类的主要就是BeanPostProcessor了,可以从我的手写rpc项目的文章中找到。
2024-10-04 20:41:19
822
原创 个人提升效率的编程工具汇总
你是否还在为敲代码进入状态时,仍然需要跳转到某一行而被打断,就像是寸止(笑)一样难受,你是否已经被键盘右侧的方向键还需要移动手臂才能碰到感到不解?如果你用惯了yum、apt、npm,如果你苦于搜搜应用时找不到官网(笑),那么你可以尝试使用Scoop这个Windows的包管理工具。至于为什么不推荐emacs,对于后端来说,服务器上的默认编辑器就是Vim,提前,在日常中就尝试练习键位,可以更加方便的服务器上使用。Docker为你解决环境问题,同时可以结合Docker Copose来实现多项目和环境的快速配置。
2024-10-03 11:27:23
452
原创 Spring 循环依赖会出现什么情况? 如何解决?
在Spring项目中我们经常使用 @Autowired或者@Resource去注入Bean,我们称之为依赖。当多个Bean之间存在互相依赖的关系,并且出现了循环调用时,Spring就会找不到依赖的七点,就会死循环直到抛出异常。例如:A依赖B,B依赖C,C依赖A,三者必须在依赖的类初始化之后才会初始化自己,从而出现死循环。
2024-10-03 11:05:30
624
原创 深入浅出线程池——从源码层面解析线程池
Executor、Executors、ExecutorService、AbstractExecutorService、ThreadPoolExecutor、ForkJoinPool之间的关系。鄙人在公司实习时,看见了公司的自定义线程池结合CompletableFuture异步获取结果,对线程池的实现感兴趣,于是花了些时间来解决来弄清楚线程池的执行原理。先简单介绍一下之间的关系,Executor是最底层的定义,ExecutorService继承了Executor。
2024-10-02 17:44:08
540
原创 Future & CompletableFuture深入解析
让我们首先关注它的定义...可以发现奥秘就在这个接口中,用于标识执行过程中的一个步骤(Stage),从而实现了服务编排Completion是定义在CompletableFuture里的。
2024-10-01 11:34:13
1015
原创 Java中常用的线程工具(JUC)
Wait释放的锁是写在Java对象头中,所以是写在Object中而非当前线程CountDownLatch 是通过一个计数器来实现的,计数器的初始值就是线程的数量,每当一个线程执行完毕之后,计数器的值就-1,然后在闭锁上等待的线程就可以恢复工作了。用于等待多个线程完成一个整体的前提任务实例:在进行业务之前将两个数据库中的数据进行同步(非集群的数据库)// 这里是同步数据库1的代码// 这里是同步数据库2的代码}).start();}).start();
2024-10-01 11:31:27
1007
原创 HashMap源码分析与常见八股
当链表的长度大于TREEIFY_THRESHOLD(默认为8)时会开始转化,同时要判断Node数组的个数是否大于MIN_TREEIFY_CAPACITY(默认64),如果小于就会先进行扩容,而不是转化,如果大于就直接转化为红黑树。时,会转化,如果当前数组长度小于64就学会先进行数组扩容,否则就转化为红黑树,默认大小为16,每次扩容2倍。拉链法就是使用一个链表数组,数组中的每一格都是一个链表,如果遇见哈希冲突,则将冲突的值加到链表中。可能是一个空元素,也可能是链表已存在,所以要区别对待。
2024-09-30 11:02:04
1896
原创 ThreadLocal原理解析
ThreadLocal实际起作用的是ThreadLocal内部的ThreadLocalMap类,对于每一个Tread,都有一个ThreadLocalMap属性,从而实现线程隔离,然后set的时候就通过获取当前线程然后给他的ThreadLcoalMap属性添加值。因为ThreadLocalMap的key是Thread,如果像普通的key-value的定义,只要线程未销毁。就会一直存在,所以使用弱引用就可以在不存在强引用的时候就将这个销毁。
2024-09-30 11:00:43
220
原创 MySQL中NULL值是否会影响索引的使用
🐭🐭在面试的时候被问到NULL值是否会走索引的时候,感到有点不理解,于是事后就有了这篇文章问题:为name建立索引,name可以为空是否会使用索引?生活会拷打每一个做事不认真的人😭。
2024-09-29 22:35:25
895
原创 深入浅出动态代理
面试中经常被问到动态代理相关内容,每次都答得不够完美,又因近期在尝试手写RPC框架,了解到不少的动态代理相关的内容,顺道总结一下,于是就有了这篇文章。
2024-09-23 22:39:24
511
原创 Github学生包/学生认证申请那些事/Github Copliot免费使用
一定要有耐心,不挂梯子的话,github的访问基本上是时有时无的,所以要有耐心,多试试,过几天再试试,推荐在学校里申请,或者使用学校的vpn访问网站祝通过!!!
2024-09-23 22:35:16
1146
原创 工作室招新题解
双指针指向左边第一个要交换的和右边第一个要交换的字符第一次交换的是{n-1,n} 和{2n-1,2n}第二次{n-1,n}和{2n-2,2n-1}以此类推,可以得到,左边交换的下标往左移1位和右边下标往左移2位是轮流的,那么就可以用一个cnt来记录次数,实现反复移动但是当左界下标移动到4的时候,就不一样了,看不出来规律,直接按样例来进行移动下标了感觉是这里面最难的了。
2023-06-11 15:16:52
210
1
原创 LeetCode第 347 场周赛 6455.使所有字符相等的最小成本
4.因为每次反转之前已经保证了一部分连续的字串已经相等,所以即使继续反转这部分字串仍然相等。-> 11010 或者 00101。3.从前往后或者从后往前遍历,字符串的个数从0到n-1即可保证所有的字符都相等。反转左侧 反转右侧。2.反转时两种方式都能使得相邻的字符相等,选择代价最小的即可。1.遇见相邻的两个字符不相等就需要反转。例如:01010 从前往后遍历。
2023-05-28 13:57:17
164
1
原创 C++ 优先队列(priority_queue)自定义比较pair类型的方法
第一个参数为所要存储的数据类型,第二个是容器类型,默认为vector,但不能是list,第三个为自定义比较方法。优先级越大的在queue中排的越往后,因为取的是top。原理:自定义类来重载“( )”运算符。是遇见使用pair和优先队列的问题。
2023-04-01 16:54:02
1197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人