随笔
文章平均质量分 75
DaHuangXiao
这个作者很懒,什么都没留下…
展开
-
vscode 自定义格式化之 openharmony 代码规范
前言个人比较懒,但又必须遵守 openharmony 代码规范,因此通过修改 vscode 格式化方式来满足需求,openharmony 代码规范官方地址为 https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81.mdvscode 自定义格式化经比较,vscode 中 google 的格式化模板与 openharmony C++ 代码规范要求最为接近,只是缩原创 2022-05-01 10:01:56 · 1537 阅读 · 0 评论 -
2021个人秋招经验分享(算法转研发)
本人情况,普通211本硕,今年四月找算法实习四处碰壁后下决心转研发,无实习无项目经历,截止目前已经收到字节,大华,贝壳的意向,其他的还有阿里(待意向),海康(待意向),华为(待主管面),被pass的也有很多,拼多多(hr面挂),腾讯(2面挂),以及数不清的中小厂二面挂,如有赞,滴滴等打算将这五个月认识到的问题以及求职的方法做一个总结,并分享给大家,希望能帮助到和我一样想要转岗的人关于转岗原因,每个人都有每个人的想法,我主要分享一下为了转岗我做了哪些事情首先,是准备阶段。考虑到我没有实习没有项目,在项原创 2021-09-15 15:40:31 · 768 阅读 · 11 评论 -
ThreadLocal原理浅析
前言记录一下ThreadLocal的底层实现使用Web开发中,我们常常会配置一个拦截器对请求进行拦截,并判断对应session是否已经登录,若登录将用户信息放入ThreadLocal中,便于当前线程在后续执行Controller方法时能够继续使用实现拦截器@Componentpublic class AuthInterceptor implements HandlerInterceptor{ // 新建 ThreadLocal public static ThreadLocal<原创 2021-08-26 16:55:09 · 91 阅读 · 0 评论 -
jdkSPI机制浅析
前言面试常会问到javaSPI与dubboSPI区别,关于dubbo的SPI已经做过浅析,现在对javaSPI做梳理问题javaSPI缺点?一次性加载,如何一次性加载?加载完如何获得想要的实现类javaSPI加载哪个路径javaSPI主要解决什么问题使用使用上,通过ServiceLoader.load(Interface.class)就能够加载目录为META-INF/services下关于Interface.class定义的实现类,通过遍历迭代器的方式遍历每个实现类,再根据需要对实现类进行原创 2021-08-19 09:52:21 · 129 阅读 · 0 评论 -
Netty源码浅析
前言到目前为止,已经看了不少框架的源码了,但如何对源码做笔记并写博客,不同框架适合的做笔记方式也不同对于Netty框架而言,我认为以对比学习+回答问题的方式来浅析源码会好一些,因为Netty本质上也就是基于NIO的一个非阻塞网络编程框架,那么本篇笔记就对比一个简单的NIO非阻塞网络编程,看看Netty是如何实现的流程解析看Netty源码主要就是去看其如何实现Reactor模式的,关于Reactor的演变,在《初识Netty》中我做了对比,不进行赘述本节主要比较一下NIO的传统非阻塞方式与Netty原创 2021-06-28 20:43:05 · 516 阅读 · 1 评论 -
Netty之多任务版Guarded Object模式
前言Netty作为RPC框架的常用底层实现,Consumer每次发送请求给Provider,如何第一时间获取到服务器返回的结果呢?netty本身只实现了连接建立与监听的异步机制,要想实现这一点,得使用FutureDemo介绍搞了个小Demo,测试了一下多任务Guarded Object模式在netty网络编程的应用,并测试一下Channel与Boostrap以及EvenGroup的关系Provider.javapackage com.hx;import io.netty.bootstrap.S原创 2021-06-23 22:15:39 · 147 阅读 · 2 评论 -
Dubbo源码浅析之SPI机制
前言Dubbo通过ExtensionLoader实现了SPI机制,给整个框架提供了扩展性,看源码过程中发现用了很多次synchronized以及ConcurrentHashMap,粗略思考了原因,记录下这篇笔记使用简单说一下使用Serialization serialization = ExtensionLoader.getExtensionLoader(Serialization.class).getExtension("kryo");上述代码加载了下述路径下对应文件中由kryo指向的com.原创 2021-06-23 11:19:55 · 158 阅读 · 1 评论 -
java随笔之JVM内存模型与类加载
前言结合类加载与对象创建来梳理一下JVM内存模型的功能JVM内存模型图片来自 (https://www.cnblogs.com/zhou-yuan/p/14252272.html)随着JDK的升级,方法区最后被淘汰,常见面试题主要以JDK1.7的模型为主淘汰原因是对方法区的GC不好控制,内存也不好管理,容易OOM功能以JDK1.7为例绿色为线程共享,蓝色为线程独占程序计数器:记录线程执行到哪里,便于线程被唤醒后能够继续接着执行虚拟机栈:执行java方法的栈区,其由多个栈帧组成,每调一原创 2021-06-18 10:42:23 · 83 阅读 · 0 评论 -
java源码浅析之HashMap(1.7)
前言为了与1.8的HashMap进行比较,阅读并记录一下1.7的HashMap,但由于已经是过期的产物,就不看得太细源码初始化 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f; p原创 2021-06-17 18:35:00 · 129 阅读 · 0 评论 -
java源码浅析之HashMap(1.8)
前言了解一下HashMap的底层实现,强调一下是1.8的源码初始化三种构造方式 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f; int threshold; publi原创 2021-06-17 11:03:02 · 130 阅读 · 1 评论 -
java源码浅析之ArrayList扩容机制
前言准备面试,从源码上看一下ArrayList的扩容机制扩容机制底层结构就是一个Object数组,那么意味着对其初始化一个固定长度后,就不能改变了,要想改变,只能复制到新的数组中初始化三种方式,只需要了解前两种 private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transie原创 2021-06-16 22:09:00 · 115 阅读 · 0 评论 -
Spring源码之事务原理
前言前一篇写完AOP,接着就把事务原理写了原理看源码前可以先思考一下如果要使用AOP实现事务管理应该怎么做?只需要自定义一个Advice,在执行事务方法时,执行try/catch,判断是否全部成功,成功则提交,否则回滚所以要理解事务原理,只需要了解清楚Advice是怎么被绑定到代理对象中的Advice执行了什么方法流程图上述流程图与AOP流程类似,故不进行太详细的讲解,AOP流程在上一篇文章有解析黄色部分 (后置处理器注入)与AOP类似最终将Infrastructure原创 2021-06-15 11:14:07 · 70 阅读 · 0 评论 -
Spring源码浅析之AOP、Aspect、Advice
前言理一理AOP与切面(Aspect)、通知(Advisor)的关系概念通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。切点(PointCut): 可以插入增强处理的连接点。切面(Aspect): 切面是通知和切点的结合。做了张图PointCut:指的是具体原创 2021-06-15 10:27:21 · 1086 阅读 · 1 评论 -
java线程之运行与打断
前言小结一下常见的Thread关键点线程启动与运行三种方法方法一,直接使用Threadnew Thread(){ @Override public void run() { System.out.println("第一种方法"); }}.start();方法二,使用Runnable配合Threadnew Thread(()->{ System.out.println("第二种方法");}).start();方法三,FutureTa原创 2021-06-11 10:26:54 · 1819 阅读 · 1 评论 -
java源码浅析之dubbo
前言最近在看RPC框架,选择先看dubbo,再看netty,最后手写一个RPC的学习路线,结合雷神关于dubbo的讲解,对源码流程进行一个简单的记录使用所谓RPC就是远程服务调用的意思,那么dubbo怎么完成远程调用的呢?以SpringBoot框架整合为例导入dubbo的starter依赖 <dependency> <groupId>com.alibaba.boot</groupId> <原创 2021-06-10 16:16:54 · 169 阅读 · 0 评论 -
java源码浅析之SpringMVC
前言今天简单看了一点SpringMVC的源码,做一下记录流程分析我们知道springMVC的关键点在于使用了前端控制器Dispatcherservlet进行请求的分发,而不再需要定义其余servlet实现业务逻辑,那么它是怎么实现的呢?为此,我依旧是对Controller某个方法打了断点,利用逐步deubg的方式进行探究,对整个流程总结如下黄色部分tomcat将请求分配给DispatcherservletDispatcherservlet主要调用了dispatch方法蓝色部分这部分原创 2021-05-29 15:31:14 · 63 阅读 · 1 评论 -
javaWeb与Spring学习小结
前言由于我是先学的springboot,然后才学spring,接着springMVC,最后才学的javaWeb,内容比较多容易搞混,在此自己进行一个小总结,比较一下它们之间的关系。javaWebtomcat服务器会管理我们自定义的servlet,通过web.xml中的servlet-mapping,tomcat能够将不同请求转交给对应的servlet,实现一系列的功能。filter用于拦截请求,也由tomcat管理,并通过web.xml配置查找对应的filter路径SpringMVC原创 2021-05-29 10:14:44 · 2180 阅读 · 0 评论 -
使用IDEA快速创建springMVC的helloworld
前言记录一下通过IDEA快速创建springMVC环境的过程,及遇到的问题步骤新建工程,选中如下三项,Spring MVC,Web Application,Application Server完成创建后可以得到以下目录点开Project Structure-》problem,将两条问题都fix编辑web.xml,注释绿框内容,添加红色部分,修改黄色部分。我们都知道,SpringMVC的原理是利用前端控制器DispatcherServlet来统一进行所有请求的分发,并且tomcat创建原创 2021-05-29 09:28:32 · 274 阅读 · 1 评论 -
java源码浅析之Springboot自动装配
前言在弄清楚Spring如何解析注释后,去探究了一下Springboot的自动装配,做下记录自动装配接着spring注释解析的流程图,我们可以得到自动装配的流程图蓝色部分为自动装配过程主要先由配置类增强器解析配置类上的@Import注解能够解析得到AutoConfigrationImportSelector回到parse这一步的下一步,就是执行ImportSelector的process方法该方法的作用就是读取spring.factories文件下的EnableAutoConfigrat原创 2021-05-26 21:15:03 · 72 阅读 · 0 评论 -
java源码解析之注解解析流程
前言搞明白bean的生命周期后,就去看了下spring怎么发现注释并解析,从而将对应组件注册进容器中的。比如定义一个配置类如下,spring是如何检索到每个@Bean注解并将其对应bd生成的,以及ComponentScan怎么实现Componen检索等@Configuration@ComponentScan("hx.spring")@EnableAspectJAutoProxypublic class AspectConfig { @Bean public A a(){原创 2021-05-26 16:39:33 · 335 阅读 · 1 评论 -
java源码解析之spring循环依赖
前言今天学习了循环依赖,做下记录,顺便体会以下spring框架的巧妙之处背景知识对Spring源码有所了解对bean的创建周期比较熟悉推荐视频:b站马士兵老师的spring循环依赖循环依赖是什么?定义如下两个类,并互相依赖public class A { private B b; public B getB() { return b; } public void setB(B b) { this.b = b; }原创 2021-05-24 19:00:07 · 120 阅读 · 1 评论 -
java源码浅析之Spring容器
前言通过上一篇文章对AOP的初步探究,慢慢理清了bean的创建流程,找时间从头粗略读了一遍源码,在此做一个记录。感觉Spring源码挺好读的,注释也写得很详细,我从零阅读spring源码用了一天多的时间,下一篇对读源码心得进行一个自我总结吧背景知识关于spring源码,有人觉得苦涩难懂,有人享受探索的乐趣,我认为区别就在于底子是否牢,如果动态代理都不了解就想去看懂AOP的源码那肯定是不行的。建议先了解Spring的使用(注解开发)bean的概念bean的生命周期beanFactorybe原创 2021-05-23 16:13:21 · 75 阅读 · 1 评论 -
java源码浅析之AOP
前言继之前写了一篇Proxy源码浅析后打算去看AOP,由于本人刚学java不久,Spring看得很粗,以至于看源码比较慢,不过在学习过程中逐渐提高了探索源码的能力,觉得整个过程也挺有趣,故做此记录。主要记录一下作为一名java初学者是怎么探索Spring框架的预备知识所谓磨刀不误砍柴功,在探索源码之前,我通过B站以下两个系列视频稍微了解了一下Spring的大体框架,但听的时候似懂非懂雷神的注解驱动开发(IOC和AOP部分)周瑜老师的手写Spring看完视频后能够大概掌握注解开发以及AO原创 2021-05-22 14:45:03 · 181 阅读 · 0 评论 -
java源码浅析之线程池ThreadPoolExecutor
前言打算把JUC下常用的几个类源码都看一遍并做记录,今天是线程池ThreadPoolExecutorThreadPoolExecutor看源码前我会先通过其作用猜测源码的大概流程,带着问题去看源码那么我们复习一下ThreadPoolExecutor的作用是什么调用excute执行一个tasktask会派给线程池中的线程执行如果线程池所有线程都正在执行任务则将task丢入等待队列待有空闲线程后从队列中拉task继续执行线程池最大的作用就是可以复用线程,并且限制线程数上述是线程池简单的原创 2021-05-17 23:04:36 · 122 阅读 · 2 评论 -
java源码浅析之Proxy动态代理
前言最近学反射的时候了解了一下其应用——动态代理,觉得挺有意思,在此记录一些对动态代理的理解,并对源码进行简单的梳理反射浅析动态代理之前先复习一下什么是反射?简单理解反射就是以类对象作为入口,能够获得类内所有内容的一种方式比如调用某个类中的方法时有两种方式常见的就是创建一个对象实例,然后调用其公共方法另一种就是通过反射,先获取类对象,通过类对象根据方法名获取对应的方法,用invoke(obj,arg)的方式调用在此就不进一步复习了,之所以先复习反射调用方法是因为理解动态代理要用静原创 2021-05-17 12:09:38 · 154 阅读 · 0 评论 -
java源码浅析之FutureTask
前言无聊看看源码吧,写成博客加深印象FutureTask先复习一下怎么使用的 FutureTask<Integer> task = new FutureTask<>(() -> { TimeUnit.SECONDS.sleep(3); System.out.println("正在执行计算"); return 100; }); new Thread(tas原创 2021-05-16 17:18:28 · 114 阅读 · 2 评论 -
java源码浅析之ConcurrentHashMap
前言最近刚入门java,觉得看源码挺有意思的,就记录一下一些常用类的源码吧,从而能够总结一些使用细节记录形式打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分ConcurrentHashMap直接模拟该类的使用过程,从而一步步看其怎么运作的吧,当然最好还是带着问题一遍思考一遍总结会比较好,我阅读源码的时候带着以下几个问题并发体现在哪里?怎么保证线程安全的怎么扩容的?扩容是怎么保证线程安全的?怎么put的?put是怎么保证线程安全的?用了哪些锁?这些锁的作用是什么?原创 2021-05-16 14:22:17 · 106 阅读 · 2 评论 -
java多线程之HashMap死链死循环
前言简单记录并且模拟一下死链的形成过程问题描述在jdk1.7中,HashMap使用头插法往链表插入新元素,在并发操作下会出现死链预备知识hashmap的数据结构在此就不提了为了方便模拟,在此把单线程下的扩容过程复习一遍假设初始数组大小为161号位中存放链表其顺序为1-》35-》16开始扩容(自行画图便于理解)新建大小为32的数组开始将原数组元素依次移动至新数组移动伪代码,以移动1号位为例e:表示需要被移动结点的指针(目前为1-》35-》16-》null)next:表原创 2021-05-15 16:06:54 · 298 阅读 · 0 评论 -
java多线程之Semaphore
前言在熟悉了AQS以及读写锁之后,Semaphore更简单了Semaphore还是和前几篇总结一样,不直接看源码,而是先思考怎么通过AQS的结构完成Semaphore的目的Semaphore的作用是什么限制同时能有多少个线程获取锁线程占锁达到限制后,进入队列等待可以用于数据库连接池的实现同时多个线程获取锁怎么实现?其实就是读写锁的读读并发实现嘛很快就能想到,走的是AQS的共享入口acquireShared复习一下该入口AQS会做什么获取锁后会唤醒其后线程并且不需要考虑o原创 2021-05-15 10:45:53 · 62 阅读 · 0 评论 -
java多线程之读写锁
前言上午看了AQS和ReentryLock的源码,下午趁热打铁把ReentryReadWriteLock的源码也看了,其实只要理解了AQS大概流程,基于AQS的锁都很好理解。下面的总结是在熟悉了AQS结构的基础上进行的。读写锁在看源码前,如果想要基于AQS或者说类似monitor的结构实现一个读写锁应该是什么思路?回忆一下上一篇AQS笔记提到的AQS结构中常用的四个变量,state,head,tail,ownerThread读写锁能做什么?读读可以并发读的时候不能写写的时候不能读写写不能原创 2021-05-14 21:28:33 · 297 阅读 · 0 评论 -
java多线程之AQS
前言今天从ReentryLock阅读到AQS的源码,发现看得很轻松。前提是得对 synchronized底层原理比较熟悉,其原理和AQS很像,感觉AQS就是一个基于Java的monitor实现。那么接下来我将类比monitor的结构来记录我对AQS流程的理解。AQS首先什么是AQS,个人认为就是一个类似monitor的结构,ReentryLock只不过利用了这个结构实现了可重入,公平与非公平的高级逻辑罢了。所以为什么说所有的锁都是基于AQS的。参考黑马笔记的结构图来说明组成部分state原创 2021-05-14 14:48:34 · 254 阅读 · 1 评论 -
java多线程之互斥与同步解决方案
前言最近在看黑马的并发编程笔记,讲得很好,对此进行一下总结总结的目的不是抄一遍笔记,而是谈谈自己的理解加深记忆涉及线程互斥与同步synchronized使用细节及原理Reentrylock使用细节三种模式思路线程互斥与同步互斥:指的是多个线程不能同时访问共享变量同步:指的是多个线程按指定的顺序执行操作在同时有多个线程运行过程中,如何达到互斥和同步呢?加锁即可在此使用黑马笔记中room例子来说明锁。(ps: 以前就了解锁,但总会记乱,发现使用形象化记忆后就很清楚)解原创 2021-05-11 16:42:18 · 1101 阅读 · 0 评论 -
java随笔之join原理
前言学习了 wait() 和 notifyAll() 后就看了下 join() 的源码,join() 其实就是用的 wait() ,但它是怎么阻塞主线程的呢?背景知识我们知道只有在 synchronized 加了锁后才能进行wait() 和 notify()wait() 的作用是将当前占锁的线程放入monitor的waitset中只有当某个线程占锁后,调用notify()才会唤醒waitset的进程,notifyAll()则是唤醒waitset中的所有进程补充一个知识点是,monitor是实现原创 2021-05-10 20:46:33 · 67 阅读 · 0 评论 -
线程sleep结束后会重新load主存吗?
前言该问题在看JUC课程的时候遇到,记录一下背景知识该问题主要与可见性有关从JMM我们可以知道,线程先将变量从主内存拷贝到工作内存,更新完成后再刷新回主内存。此时如果有多个线程并发修改共享变量,就会出现,A、B同时拷贝变量到工作内存,A修改后,B是感受不到的举个例子@Slf4j(topic = "c.VolatileDemo")public class VolatileDemo { static int cache = 0; public static void mai原创 2021-05-10 15:07:15 · 651 阅读 · 2 评论