- 博客(39)
- 收藏
- 关注
原创 关于多线程你了解多少?
NEW表示线程刚刚创建。当调用线程的start()方法后,线程就开始执行了(注意这个说法只是为了让我们有个形象的了解),此时线程处于RUNNABLE状态(这里要清楚线程处在这个状态就表示线程所需的一切资源都已经准备好了)。如果线程在执行过程中,遇到了synchronized同步块,就会进入BLOCKED阻塞状态,这时线程处于暂停状态,直到获得请求的锁。WAITING和TIMED_WAITING都表示等待状态,区别在于前者会进入一个无时间限制的等待,后者会进入一个有时限的等待(处于等待状态的线程究竟在等什么呢
2024-08-27 20:36:55
798
6
原创 何为MethodHandles?
所谓方法句柄是指对基础方法、构造函数、字段或类似低级操作的类型化、直接可执行的引用,具有参数或返回值的可选转换。更简单地讲,方法句柄是一种用于查找、调整和调用方法地低级机制。方法句柄是不可变地,并且没有可见的状态
2024-08-26 22:31:08
1060
1
原创 重新认识AbstractQueuedSynchronizer
AbstractQueuedSynchronizer类,并非一个现成的类,而是java并发包(java.util.conncurrent.locks)中的一个抽象基类,主要用于构建锁或其他同步器。它提供了一个框架来实现依赖于共享资源管理的同步器。AbstractQueuedSynchronizer通常又被简称为AQS
2024-08-21 22:32:52
1368
1
原创 ThreadPoolExecutor详解
线程池的任务提交流程为:先判断当前线程池中是否存在正在运行的工作线程,并判断其与核心线程数的关系。如果小于核心线程数,就创建工作线程并执行当前任务;如果大于核心线程数,则将当前提交的任务放置到任务队列中等待有空闲线程时进行调度;如果任务队列中不存在足够的空间,则判断线程池中活跃的线程数与最大线程数的关系,如果小于最大线程数,则创建新的工作线程执行当前被提交的任务;如果大于最大线程数,则启动拒绝策略
2024-08-18 21:56:45
819
1
原创 Java NIO 之概述(一)
JDK中与NIO相关的类均被放在java.nio包及其子包下,并且它们对原java.io包中的很多类都进行了改写。NIO有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)
2024-07-28 21:43:40
1016
4
原创 Spring 之 Lifecycle 及 SmartLifecycle
关于Lifecycle,网络平台给出的解释是这样的:它是Spring框架中的一个基础接口,用于简化管理有状态的组件(譬如连接池、定时任务等)的初始化、启动、停止等生命周期过程。
2024-06-03 22:34:34
1827
7
原创 SpringBoot自动装配(二)
前篇(《SpringBoot自动装配(一)》)言至自动装配之入口及过程。虽小有所得,但终是狂妄自大,思虑不周,遗问颇多,譬如:千万自配者,何以滤之?还有上篇文章想当然的认为DeferredImportSelector接口的实现类AutoConfigurationImportSelector中的selectImports()方法是在ConfigurationClassParser#processImports()方法中,实则不然。
2024-05-14 22:03:50
1040
1
原创 SpringBoot自动装配(一)
在Spring中@Import注解的作用是用来导入额外的配置类或者组件类,以扩展当前上下文中的Bean定义集合。这意味着当我们在一个配置类上使用@Import注解时,Spring容器会在初始化过程中处理被导入的类,并依据类的不同特性执行不同的操作
2024-04-14 21:44:29
806
原创 初识Spring Cloud
Spring Cloud是一个针对微服务架构设计的标准化一站式开发框架,它通过整合和封装各种成熟的第三方库和服务,为开发者提供了一整套开箱即用的微服务开发工具及最佳实践,使得在搭建和管理分布式系统时能更高效、更便捷,从而更好地应对云计算环境下的服务治理挑战
2024-04-02 22:24:01
1052
1
原创 MyBatis是纸老虎吗?(七)
在MyBatis中一级缓存的生命周期和SqlSession一致;一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺;一级缓存最大范围是SqlSession内部,如果有多个SqlSession或者在分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement
2024-03-25 19:46:19
994
原创 MyBatis是纸老虎吗?(六)
SqlSource是创建一个sql命令字符串原材料,这要怎么理解呢?大家都知道MyBatis提供了很多定义一个sql语句的xml标签吧,比如insert、select、delete、update、sql、parameterMap等等,这些数据解析后会用SqlSource表示,之后通过调用MappedStatement对象上的getBoundSql()方法,该方法会接受一个Object类型的参数值对象,比如本篇案例中提到的UserDto对象,会创建一个BoundSql对象。
2024-03-24 16:05:04
990
原创 MyBatis是纸老虎吗?(五)
通过这篇文章我们知道mapper文件中的sql命令在java中是通过MapperStatement类来表示的,在mapper中,我们可以配置的元素有很多,最常见的是resultMap、insert、delete、update、select及sql等
2024-03-23 15:12:09
720
原创 MyBatis是纸老虎吗?(四)
InterceptorChain是一个容器(暂时这么理解吧),用于存放实现了Interceptor接口的拦截器(通过InterceptorChain中的addInterceptor()方法完成拦截器的添加,数据会添加到InterceptorChain中的interceptors中)。其次该接口中的pluginAll()方法的主要作用是遍历Interceptor拦截器组成的集合
2024-03-19 21:18:42
1056
原创 MyBatis是纸老虎吗?(三)
该方法中的Environment.Builder用到了建造者模式,这里的这个写法是我熟悉的建造者模式的标准写法(定义主类及主类中的Builder类,注意这两个类的属性完全一致,主类中的所有属性只提供get方法,Builder类中既提供get方法,又提供set方法。这里一定要注意主类的构造方法会对相关属性进行判断(实际中不一定要有)。最后使用时先创建Builder对象,然后调用Builder对象上的build()方法创建主类对象)
2024-03-17 20:08:16
1075
原创 MyBatis是纸老虎吗?(二)
要回答这个问题,我们可以用一下经验主义。中文中有一种造字手法叫形声字,它是在象形字、指事字、会意字的基础上发展起来的。这种字的特点是:它由两部分组成,一部分表示意义的意符(也称为形旁),另一部分表示声音的声符(也叫做声旁)。形声字的形态多样,可以有不同的排列组合,比如常见的材、偏等等。如果按这种造字方法理解,我觉得前者是一个工厂类(Factory表意,Transaction是一个偏旁),主要用于创建Transaction对象。而后者类似于汉字中的单字,譬如王、土等,王、土这些字表示一种具象化的事务,个人认为
2024-03-10 21:23:38
1170
3
原创 MyBatis是纸老虎吗?(一)
工作这么久,也换了不少工作,每次面试还像高中时参加考试一样,胆战心惊,不知所措。说好听点,是心理素质差,缺乏经验;说难听些,就是知识点掌握不到位,毫无勇气面对别人的考察
2024-03-03 13:30:45
469
原创 ThreadLocal“你”真的了解吗?(二)
ThreadLocalMap是Java中ThreadLocal类中的一个内部类,其主要作用是用于实现线程的本地存储(ThreadLocalStorage,即TLS)的功能。每个线程都有一个与之关联的ThreadLocalMap,在这个map中,键是ThreadLocal对象,值则是我们真正想要在当前线程中保存和隔离的变量。
2024-02-21 22:46:33
1192
3
原创 ThreadLocal“你”真的了解吗?(一)
总的来说,ThreadLocal通过为每个线程维护一份独立的数据副本,巧妙地实现了多线程环境下的数据隔离和安全性,并简化了代码的编写,减少了同步块或锁的使用。但它也要求开发者关注并正确管理其生命周期,以免引发内存泄露问题
2024-02-19 23:04:39
1431
1
原创 Spring 事务原理总结七
总的来看,将TransactionInfo绑定到当前线程的主要目的就是解决嵌套事务的。Spring解决嵌套的主要思路就是先将当前的TransactionInfo对象绑定到当前线程,当当前TransactionInfo对应的业务处理代码调用其他事务代理时,会将当前线程中保存的TransactionInfo对象赋值给新的TransactionInfo对象的oldTransactionInfo属性,然后将新的TransactionInfo对象重新绑定到当前线程的ThreadLocal上,这样就实现了前后两个事务的
2024-02-18 22:31:48
1208
原创 Spring 事务原理总结五
这个方法的主要作用就是判断当前是否存在存活的事务,如果存在事务,则处理之,否则继续。接着就是判断事务是否超时,如果超时,直接抛出超时异常,否则继续。之后就是对事务传播行为的判断,首先就是判断当前的事务传播行为是否为PROPAGATION_MANDATORY,根据《Spring 事务原理总结一》这篇文章的介绍,这个事务传播属性的作用是如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
2024-02-15 02:45:00
3248
原创 Spring 事务原理总结四
通过前面三篇文章,我知道了事务的配置流程,也懂得了向Spring容器中注册事务的流程,更了解了Spring事务中的相关组件及其作用,但这依旧无法让我认识到这个知识点的全貌,所以希望通过今天的跟踪能完全了解Spring事务;也希望通过这次跟踪对Spring事务进行一次总结;更希望通过这次跟踪结束本系列,以为后面的学习腾出时间。
2024-02-14 12:31:27
1432
原创 超时引发的牛角尖二(hystrix中的熟悉面孔)
我们系统调用他们系统地请求会被包装到HystrixCommand子类对象中,然后通过调用该对象上地execute()方法来完成
2024-02-04 22:09:39
1124
原创 Spring 事务原理总结三
梳理一下Spring事务用到的几个核心组件。这些核心组件是我们理解Spring事务原理的基础。通过它们我们可以体会学习一下Spring设计者设计Spring事务时的基本思路
2024-02-03 22:02:02
1069
原创 基础知识总结
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。而网络编程就是编写程序使联网的两个或多个设备(比如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口可以很方便地进行网络编程。接下来将介绍网络的一些基础知识,然后讲解如何通过Java语言进行网络编程。
2024-01-30 22:11:14
886
原创 超时引发的牛角尖一(hystrix概述)
因此,Hystrix是一个强大的库,它通过对服务调用的封装、控制和监视,增强了分布式系统在面对依赖服务延迟、故障时的韧性,从而降低整个系统因依赖关系复杂而引发的风险。类似于电路中的断路器,当某个服务连续失败达到一定阈值时,Hystrix会“熔断”该服务调用,后续请求不再尝试调用故障服务,而是直接进入降级逻辑。针对分布式系统服务之间调用的容错库,它主要用于解决分布式系统中的服务雪崩问题,通过实现服务降级、服务熔断、依赖隔离、以及提供近乎实时的监控等功能。Hystrix 是 Netflix 公司开源的一款。
2024-01-29 20:57:36
393
原创 Spring 事务原理总结二
其实Spring事务的实现方式与前面梳理的AOP的实现方式类似:将事务增强方法与目标方法组成一个执行链,然后由调度者依次调度执行链中的相关方法,从而达到事务控制的目标。
2024-01-28 21:42:40
2282
1
原创 Spring 事务原理总结一
在日常工作中,大家都用过数据库,应该也知道在数据库层面有事务的概念。因为数据库作为一个公共资源,会被很多客户端操作,为了保证实际业务的准确性,一定要有一个方法来规避不可预料的风险。于是,数据库的设计者就提出了事务这个概念
2024-01-21 15:24:46
2595
1
原创 Spring AOP 总结四
Spring AOP这个点从开始写到现在已经持续很长时间了。这个系列我们从一个示例开始,然后逐渐深入,触达Spring AOP之灵魂。通过这个系列,我们不仅捋顺了AOP的定义,也知晓了Spring中AOP的基本概念,更弄清了Spring中AOP的实现细节。虽然自我感觉良好的我还想继续深入,但是毕竟物有本末,事有终始,我们不能因为一个点而错过整个世界。
2024-01-14 13:41:40
1567
原创 Spring AOP 总结三
前两篇文章我们一起梳理了Spring AOP的基本概念及其解析和创建代理的过程,通过梳理我对Spring AOP的认识又向前迈了一大步。不过,对于代理创建过程着墨较少,本篇文章我想继续就这个话题展开,也希望通过这次展开,能让我们对Spring AOP中的CGLIB代理有一些不一样的认识。前一篇文章提到过,Spring创建代理方式是CGLIB(有兴趣的可以浏览一番)。这个创建过程究竟是怎么进行的呢?
2024-01-11 22:10:00
1105
原创 Spring AOP 总结二
AOP是一种编程思想,用于将程序中的横切关注点(如事务、日志)从业务逻辑代码中分离出来,以提高代码的可重用性和可维护性。Spring框架对其进行了实现。在Spring中AOP是通过代理模式实现的,即在运行时动态的生成一个代理,这个代理类会拦截目标对象的方法调用,并在方法执行前后添加响应的横切逻辑
2024-01-07 19:48:00
1086
原创 Spring AOP 总结一
AOP是一种编程思想,用于将程序中的横切关注点(如事务、日志)从业务逻辑代码中分离出来,以提高代码得可重用性和可维护性。Spring框架对其进行了实现。在Spring中AOP是通过代理模式实现的,即在运行时动态的生成一个代理,这个代理类会拦截目标对象的方法调用,并在方法执行前后添加响应的横切逻辑
2024-01-01 13:37:09
956
原创 RMI 总结之 Socket 一
单JVM进程中,对象之间的交流非常简答:A类中new一个B类对象,然后通过这个对象直接调用B类中定义的方法;反过来B类想要调用A类中的方法,同样可以在B类中new一个A类对象,然后用这个对象直接调用A类中定义的方法即可。但这个方法无法使分布在不同JVM进程中的两个对象进行交流。那它们之间就无法交流了吗?相信聪明的你已经找到了使活跃在不同JVM进程中的两个对象进行交流的可靠方法。
2023-12-03 17:57:55
1598
原创 RMI 总结之代理
上一篇我们跟踪了RMI服务端(包含注册中心,以下提到的服务端均是这个含义)的源码。知道了服务端是如何管理服务的——通过一个内存数据结构,HashTable,来完成与服务相关的操作(存储、新增、修改、删除、查找):- 发布服务——调用Registry对象的bind()方法或者rebind()方法- 删除服务——调用Registry对象的unbind()方法- 查找服务——调用Registry对象的lookup()方法- 查询所有服务——调用Registry对象的list()方法。
2023-11-27 12:05:05
1051
原创 RMI 源码解读
很多时候,身边那些对学习有一定方法的人都会这样对我说:不必深入源码的每个细节,知道大概就行了。但每次按照这个方式学习,我都会觉得内心无比空虚,觉得懂了,却又总觉得不太懂!所以今天我想继续深入探究大神编写RMI的真实思路,以及其中用到的知识技巧。下面我们用一句代码来打开Java RMI世界的大门。(以下均为个人整理,如有错误,还望指正!)
2023-11-25 22:20:00
1060
原创 聊聊RMI
今天我想看看Java RMI开发,可能有些大佬会这样想:小菜鸡,现在谁还学这个,Spring Cloud、Dubbo不香吗?是的,从赚钱的角度看,掌握这些主流的框架很有竞争力。但我有一个毛病,如果不能把相对底层的逻辑捋顺清楚,很难有继续进行的动力,甚至会直接自我放弃,破罐子破摔。同时我还有个不好的习惯,那就是脑子笨记不住一切重要的东西,可能这就是我一直无法进步的原因吧。今天我想以RMI作为起点,用新的方式来帮助自己记住一些重要的知识。那就开始吧!
2023-11-23 22:34:26
863
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人