- 博客(60)
- 收藏
- 关注
原创 设计模式-建造者模式
建造者模式(builder模式,属于创建型模式):通过,使得对象的构建更加灵活和可控。它适用于构建复杂对象,特别是当对象的构建过程。
2024-10-10 19:41:37
616
原创 并发编程-ReentrentLock概念及使用
ReentrentLock是 Java 中JUC中的可重入锁。它提供了比synchronized更灵活的锁机制,允许更复杂的线程同步控制。支持可重入、公平及非公平锁、Condition细粒度控制、可中断。
2024-10-10 19:30:41
795
原创 并发编程-AQS锁:CountDownLatch、Semaphore、CyclicBarrier
倒计时锁CountDownLatch* 需要合理设计锁的数量,在每个线程中都需要调用countDown()方法* 主线程调用await()方法,只有当 锁的数量变为 0 的时候,主线程才会继续向下推进核心方法:await()await()
2024-10-09 16:38:17
1315
原创 并发编程-线程调度-park、unpark、join、wait、notify
在Java并发编程中,park和unpark是LockSupport类提供的两个静态方法,用于线程的阻塞和解除阻塞。park方法用于阻塞当前线程,使其进入等待状态,而unpark方法用于解除被park方法阻塞的线程。这两个方法通常用于实现线程间的同步和通信, 可以替代传统的wait和notify机制,提供更灵活的方式来控制线程的阻塞和唤醒。park方法的使用当线程调用park方法时,它会阻塞当前线程,直到以下情况之一发生:1.另一个线程调用了相应线程的unpark方法;2.中断发生;
2024-10-09 16:20:29
1492
原创 并发编程-线程池
核心线程数。线程池中始终保持的线程数量,即使它们处于空闲状态。超过这个数量的线程会根据需要创建。:最大线程数。线程池中允许的最大线程数量。当任务数量超过核心线程数时,可以创建新的线程,直到达到这个最大值。:线程的最大空闲时间。超过这个时间后,空闲线程会被终止,直到线程数量减少到核心线程数。的时间单位(如等)。:用于存储待执行任务的阻塞队列。可以是不同类型的队列,如等。:拒绝策略。当线程池无法处理更多任务时,决定如何处理新提交的任务。(可选):用于创建新线程的工厂。可以自定义线程的名称、优先级等属性。
2024-10-09 16:07:48
556
原创 并发编程-任务创建、执行-Demo
并发编程中创建任务的方式有:1.实现Runnable接口,重写run方法,无返回值;2.实现Callable接口,重写call方法,带返回值;执行任务的方式:1.使用Thread直接执行任务;2.通过线程池执行任务。
2024-10-09 12:49:59
221
原创 nacos1.4-CP架构源码
本文主要介绍nacos1.4的CP架构,nacos通过raft协议(半数以上成功)来控制集群的强一致性,在源代码中使用到countdownlatch锁来控制半数以上成功。
2024-10-06 15:19:39
1148
原创 nacos1.4源码-服务发现、心跳机制
nacos的服务发现主要采用服务端主动推送+客户端定时拉取;心跳机制通过每5s向服务端发送心跳任务来保活,当超过15s服务端未接收到心跳任务时,将该实例设置为非健康状态;当超过30s时,删除该实例。
2024-10-06 15:00:50
848
原创 ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal原理及Demo
ThreadLocal可以通过key.get()==null来判断Key是否已经被回收,如果Key被回收,就说明当前Entry是一个废弃的过期节点,ThreadLocal会自发的将其清理掉。由于线程池复用了已有线程,所以没有调用init()方法这个过程,也就不能将父线程中的InheritableThreadLocal值传给子线程。本身就是清理当前节点的,但是为了避免发生「内存泄漏」,ThreadLocal还会检查容器中是否还有其他过期节点,如果发现也会一并清理,主要逻辑在。
2024-10-06 11:31:52
1402
原创 设计模式-观察者模式
观察者模式属于行为型模式。观察者和被观察者。当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应,所以也被称作“发布-订阅模式优点被观察者和观察者对象之间不需要知道对方的具体实现,只需要知道对方的接口,避免了紧耦合的关系。由于被观察者对象并不关心具体的观察者是谁,所以在程序运行的过程中,可以动态地增加或者删除观察者对象,增加了灵活性。符合开闭原则,当需要添加新的观察者时,只需要添加一个实现观察者接口的类,而不需要修改被观察者对象的代码。缺点。
2024-10-06 10:02:34
408
原创 设计模式-适配器模式
适配器模式(Adapter Pattern)属于结构型设计模式,它的作用是。适配器让原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式包括三个角色:目标抽象类(Target)、适配器类(Adapter)和被适配者类(Adaptee)。适配器模式在实际开发中非常常见,比如我们经常需要连接各种不同的数据库,每种数据库都有自己独特的接口和方法。如果我们希望写出一段通用的代码,能够连接到任何一种数据库并执行相同的操作,那么适配器模式就非常适合解决这个问题。
2024-10-06 09:57:54
625
原创 Spring事务的7种传播机制
什么叫事务传播机制?听起来挺高端的,其实很简单。即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(propagation behavior)指的就是,这个事务方法应该如何进行。例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。
2024-10-06 09:23:19
823
原创 Spring源码-AOP具体源码
config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config),判断是否优化、是否代理目标类、是否没有接口。满足这个条件,返回CGLIB代理对象;不满足,就返回JDK代理对象。同时还会判断,判断:targetClass.isInterface() || Proxy.isProxyClass(targetClass),如果被代理的类是接口,那就返回JDK代理对象;
2024-10-06 00:07:57
1090
1
原创 Spring源码-AOP
Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等Join point:就是被代理的方法Advice代理逻辑Pointcut:表示切点(规则),用来匹配一个或多个连接点Target object:目标对象,被代理对象AOP proxy:表示代理工厂Introduction:可以为某个类介绍接口。
2024-10-05 23:56:23
861
原创 Spring源码-循环依赖
核心流程永:A创建的时候,发现依赖了B,那就创建B.B在创建的过程中,需要注入A,那就去单例池找A,如果找不到,那就去creatingSet中找A,如果存在A,那就说明。判断A需不需要进行AOP,如果需要AOP,那就提前进行AOP;如果不需要,那就返回原始对象。如果提前AOP,那就创建代理对象,并将创建出来的代理对象放到二级缓存中,二级缓存保证了代理对象只会被创建一次。
2024-10-05 23:33:17
1041
原创 Spring源码-依赖注入
核心方法是:populateBean整体流程:首先进行Spring自带的依赖注入,包括byName和byType,然后进行注解Autowired的注入。
2024-10-05 23:26:52
827
原创 CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜
本文主要介绍CGLib和JDK动态代理的使用,不对源码进行深入分析。CGLib主要使用ASM技术生成新的代理类,通过FastClass索引技术能够快速的执行代理方法,底层使用回调MethodInterceptor,重写invoke方法;而JDK动态代理时通过反射的技术与代理逻辑绑定,反射执行的效率相对低一些,底层使用InvocationHandler,重写Invoke方法即可。
2024-10-05 19:34:44
1251
原创 MySQL联合索引、索引下推Demo
测试SQL语句如下:表test中共有4个字段(id, a, b, c),id为主键首先(a,b,c),执行下面的执行结果下如下: 使用主键的覆盖索引查询,没有走索引建立联合索引(a,b,c)后,同样执行上面语句,结果如下:通过explain,我们发现,这条语句可以走索引,同时还存在Using where,说明存在回表的可能,但是这条语句是可以走索引的。(部分索引)如果我们执行下面这条语句:(结果如下:说明完全使用索引来查询。
2024-10-05 11:48:06
481
原创 windows下载Redis
双击redis.cli.exe(启动客户端),或者在cmd中输入redis.cli.exe启动客户端。(到这里已经完成redis的使用)。如下图,可以使用ping表示redis客户端已经和服务端连通。)(或者在当前目录下,cmd中输入redis.server.exe启动)下载后,将压缩包解压到你的文件夹即可。(此时,redis已经完成安装)2.3可视化管理窗口Redis Desktop Manager。2.1双击redis.server.exe即可启动(
2024-10-05 09:19:44
1430
1
原创 Spring之生成Bean
Bean的生命周期:实例化->属性填充->初始化->销毁核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons用于实例化非懒加载的bean。
2024-10-01 11:19:25
1364
原创 NIO、Reactor模式与直接内存
本文主要讲解网络通信的NIO模型、Reactor模式以及直接内存。它们在开发中都是很常见的底层知识,了解他们的原理,可以帮助我们更好的使用高级开发的工具。
2024-09-05 23:36:15
1087
原创 零拷贝:mmap、sendfile、splice
本文主要介绍零拷贝技术,包括mmap、sendfile、splice。通过零拷贝技术,减少进程的上下文切换次数、数据拷贝次数和共享总线操作的次数
2024-09-05 19:32:32
1494
原创 select、poll、epoll的原理
在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。(此处去掉了遍历文件描述符,而是通过监听回调的的机制。这正是epoll的魅力所在。epoll的优点主要是一下几个方面:1.监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目。
2024-09-05 12:26:50
1162
原创 Spring源码之scan扫描
本文主要介绍Spring源码的doScan方法,通过扫描并解析bean的元数据,生成BeanDefinition,之后再根据BeanDefinition创建bean。
2024-09-04 23:31:58
1044
原创 spring源码之ConfigurationClassPostProcessor解析配置类
解析配置类的核心类是ConfigurationClassPostProcessor,里面核心方法是postProcessBeanDefinitionRegistry,调用processConfigBeanDefinitions进行解析。ConfigurationClassPostProcessor包含解析配置类、增强FULL配置类。
2024-09-04 13:16:08
1326
原创 Spring源码之refresh
在 Spring 框架中,refresh主要用于刷新应用上下文。这一过程涉及多个重要的步骤,确保 Spring 容器的状态更新、bean 的加载以及资源的初始化。refresh。
2024-09-03 21:33:30
1199
原创 Spring源码之reader、scanner
8.注册EventListenerMethodProcessor类型的BeanDefinition,用来处理@EventListener注解的,它会去解析一个bean中的某个方法是不是监听器,也就是这个方法是不是加了@EventListener注解。在EventListenerMethodProcessor中调用afterSingletonsInstantiated(所有bean初始化后会调用这个方法),这个方法中会调用processBeans,里面进行@EventListener的解析。
2024-09-03 21:05:34
1264
原创 分布式主键
Snowflake的第二部分是时间戳,时间戳是唯一的,但是如果多个节点同时生产则会参数相同的时间戳,那怎么办?接着加唯一的值,工作机器的ID唯一呀。但是如果在一个进程中可能两个线程同时请求,那么会产生相同的(时间戳+工作机器ID),那就继续加唯一值,在加上最后的序列号,从而保证全局唯一。对于MySQL集群,单点数据库方式不可取,那对上边的方式做一些高可用优化,换成主从模式集群。:分布式主键服务本身就是一个底层的服务,很多服务都依赖于这个服务,如果底层服务都不稳定,那么上游的服务就更谈不上稳定。
2024-09-01 23:42:34
1024
原创 Feign的原理及概念
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。Spring Cloud OpenFeign对Feign进行了增强,使其支持Spring MVC注解,从而使得Feign的使用更加方便。
2024-08-30 23:19:53
1836
原创 Gateway的基本概念
Gateway网络为微服务架构提供简单且统一的API路由管理,作为系统的统一入口。Gateway可以为客户端提供统一的服务,例如认证、路由转发、防刷、流量控制、监控日志等。Gateway是无状态的,不存放数据,所以可以搭建Gateway集群。通过它前面的nginx可负载均衡到指定的网关。Spring Cloud Gateway是由WebFlux+Netty+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。
2024-08-30 23:14:39
1385
原创 Kafka日志及常见问题
目录1.Topic下的消息是如何存储的1.1log文件追加记录所有消息1.2index和timeindex加速读取日志信息2.文件清理机制2.1如何判断哪些日志文件过期了2.2日志清理策略3.Kafka的文件高效读写机制3.1Kafka的文件结构3.2顺序写磁盘3.3零拷贝3.3.1传统IO3.3.2mmap文件映射机制3.3.3sendfile文件传输机制4.合理配置刷盘频率5.客户端消费进度管理6.常见问题6.1消费者防止消息重新消费7.2消息零丢失方案7.2.1产生原因7.2.2解决方案7.3消息积压
2024-08-26 22:27:46
1479
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人