自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 SpringBoot整合Schedule详解和优化实战

Spring Schedule是Spring框架提供的一种简单的定时任务解决方案。它是基于Java的@Scheduled注解,可以让我们在不影响主线程的情况下,定时、周期性地执行任务。

2023-07-04 11:57:33 1345

原创 Springboot整合Activiti详解

这是一个查询所有部署的流程定义的方法当一个流程部署以后,就会生成一个流程定义,流程图的xml信息也会存入数据库。每次部署流程图都会生成一个新的流程定义。

2023-07-03 12:45:59 6279 5

原创 工具类之打印表格ByList

昨天在测试应用的时候,因为要查看数据库表里面的数据,但是又懒得去看数据库里面查找那张表,反而直接代码查看更方便。于是做了一个打印List的工具类,可以将List里面的数据进行打印成一个表格展示,List里面的元素的字段作为表头打印,元素数据作为表体打印。

2023-07-01 10:20:35 372

原创 Redis高并发分布式锁

线程A 上锁设置过期时间并执行任务后,希望判断比较锁的id之后去释放锁,判断通过以后系统出现阻塞,阻塞到 锁已经过期了,但是此时并未执行释放锁的操作,此时线程B上锁成功,并去执行任务。:线程A中 上锁设置过期时间 完成以后,系统出现阻塞,导致锁已经到了过期时间并自动删除了,这时候还没执行释放锁的操作,这时候线程B上锁成功,并执行任务,结果线程A反应过来了,继续执行释放锁的操作,把线程B上的锁给释放了,后面的线程上的锁都被前面的线程释放。然而,高并发也带来了一系列的挑战,其中最常见的就是超卖问题。

2023-06-29 19:44:41 883

原创 Spring之Bean生命周期源码解析

如果Spring容器包含了,则先获取Spring容器中的BeanDefinition最原始的BeanDefinition,然后查看两个BeanDefinition是否兼容,如果兼容返回false表示不会重新注册到Spring容器中,如果不冲突则会抛异常。查看是否兼容,首先是通过。如果没有已经合并的Bean的定义,则进行合并操作,先看看有没有父级Bean,如果没有为null,则直接使用当前Bean定义,当前Bean如果是属于。也就是 如果是接口或者抽象类,则返回false ,如果是具体类,则返回true。

2023-06-20 08:46:49 3260

原创 Spring源码之PostProcessor解析

在阅读Spring源码的过程中,会发现Spring框架中有许多不同类型的PostProcessor,今天整理一下Spring框架中有哪些PostProcessor,又分别起到了什么作用?

2023-06-17 19:52:54 2647 3

原创 算法之迷宫解法

前几天刷抖音刷到一个迷宫解法,觉得很有意思,想把迷宫解法好好玩玩分析一下,发现里面内容和学问多着呢,是一个非常有意思的主题。除了有如何找到迷宫从入口到出口的路径的玩法,还有如何生成一个迷宫的玩法。玩迷宫之前,首先我们要弄清楚一个问题,迷宫是什么?只有当我们弄清楚了迷宫的定义,才能玩好迷宫。Prim算法是一种用于生成最小生成树的贪心算法。最小生成树是一个图中的一个子图,它包含了图中的所有顶点,并且是所有可能的生成树中总权值最小的。生成树是一个无环的连通子图。初始化。

2023-06-14 21:51:00 1563

原创 Spring之依赖注入源码解析

Spring的依赖注入(Dependency Injection,DI)是Spring框架核心的一部分,它是实现控制反转(Inversion of Control,IoC)的一种方式。依赖注入可以帮助我们减少代码的耦合度,提高模块间的独立性和可测试性。Spring框架的依赖注入主要发生在Spring容器初始化应用上下文时。

2023-06-11 21:50:21 903

原创 解读Spring:探索FactoryBean与BeanFactory的奥秘

在Spring框架中,和是两个关键的接口,用于创建和管理对象实例。它们在Spring的IoC(Inversion of Control,控制反转)容器中发挥着重要的作用。本文将详细解释这两个接口的概念、用途和区别。和是Spring框架中的两个重要接口。是IoC容器的基础,用于管理和获取Bean实例。而允许开发人员自定义Bean的创建过程,提供了更灵活和可扩展的方式来创建和配置Bean。通过实现接口,可以实现复杂的Bean创建逻辑,并提供更高级的功能。在实际开发中,根据需求选择使用或。

2023-06-02 10:56:06 253 1

原创 Spring源码ConversionService解析

Formatter是一种用于格式化和解析对象的接口,它可以将一个对象转化为字符串,或将一个字符串转化为特定类型的对象。在Spring MVC中,Formatter通常用于将HTTP请求中的参数绑定到Java对象上,或将Java对象转化为HTTP响应中的数据。Printer接口就是对象转换为String类型的接口,Parse接口就是将String类型转换为特定类型对象的接口。是一个通用的类型转换器,它可以将一个类型转换为另一个类型。接口的方法很简单,就是判断是否可以两种类型是否可以转换,和转换方法。

2023-05-30 17:39:57 866

原创 Spring源码框架构建失败 kotlin-compiler.jar (系统找不到指定的文件。) 问题解决方法

在Spring源码构建输出的时候报错,错误信息如下:java.io.FileNotFoundException: C:\Users\ZPJX\AppData\Local\JetBrains\IntelliJIdea2022.3\kotlin-dist-for-ide\1.6.21\lib\kotlin-compiler.jar (系统找不到指定的文件。

2023-05-30 11:48:27 974

原创 设计模式之适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

2023-05-29 22:36:53 216

原创 Spring底层架构核心概念

假设一个单例Bean A 需要依赖注入一个原型模式的Bean B,每次拿单例Bean A的时候都想取到一个新的Bean B,这个时候应该怎么做?因为单例Bean A只会创建一次,也就是只会依赖注入一次Bean B,所以每次取到的Bean B都是相同的。在Spring的扫描逻辑中,默认会添加一个AnnotationTypeFilter给includeFilters,表示默认情况下Spring扫描过程中会认为类上有@Component注解的就是Bean。注解,它也会被扫描成为一个Bean。

2023-05-28 20:33:51 78

原创 Map中的computeIfAbsent方法

在jdk1.8中Map接口新增了一个方法,该方法是首先判断缓存Map中是否存在指定的key的值,如果不存在,会调用计算key的value,然后将key = value 放入缓存Map中。但如果计算出来的value为null或抛出异常,则不会记录缓存。computeIfAbsent在一些实际开发场景中,能让我们代码看去更加简洁,代码质量看去也更高。

2023-05-27 08:20:03 671

原创 Spring底层核心原理以及手写模拟实现

我们需要使用的对象都由ioc容器进行管理,不需要我们再去手动通过new的方式去创建对象,由ioc容器直接帮我们组装好,当我们需要使用的时候直接从ioc容器中直接获取就可以了。的方式,在配置文件中列出需要让ioc容器管理的对象,以及可以指定让ioc容器如何构建这些对象,当spring容器启动的时候,就会去加载这个配置文件,然后将这些对象给组装好以供外部访问者使用。在给instance注入bean对象的时候,bean对象可能还没创建,当bean为单例的时候,在singletonMap中还找不到,需要创建。

2023-05-23 17:14:20 244

原创 设计模式之观察者模式

先讲什么是行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象 之间的相互通信和协作,进一步明确对象的职责。观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

2023-05-22 15:06:02 175

原创 设计模式之策略模式

策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法的变化独立于使用算法的客户。把变化的代码从不变的代码中分离出来针对接口编程而不是具体类(定义了策略接口)多用组合/聚合,少用继承(通过使用组合方式使用策略模式)

2023-05-21 10:42:54 62

原创 设计模式之外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

2023-05-19 11:51:26 74

原创 设计模式之模板方法模式

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2023-05-19 08:13:47 61

原创 设计模式之建造者模式

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

2023-05-17 19:02:36 75

原创 设计模式之代理模式

为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样可以在不修改目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。

2023-05-17 11:02:35 277

原创 设计模式之原型模式

原型设计模式简单来说就是克隆。原型表明了有一个样板实例,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

2023-05-12 10:33:13 55

原创 设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂模式工厂方法模式抽象工厂模式。

2023-05-11 18:56:50 169

原创 设计模式之单例模式

所谓的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其实例对象的方法。

2023-05-09 12:55:54 96

原创 算法之数组篇

再仔细思考其实可以利用nums1数组的空间,从数组后往前排列,直到数组nums2没有整数即可,可以避免使用临时数组或队列,减小空间复杂度。解题过程:第一时间想到用队列,用两个数组下标指向数组,然后比较大小,数字小的加入队列,当所有整数进队列以后再出队列。改进方法:可以通过HashMap存储数组里的值,后面的值再去HashMap里面找。,再思考发现,这是将数组查找了两遍.运行成功没有问题,但是时间复杂度是。解题过程:最先想到暴力破解的方式。

2023-05-08 19:13:12 51 1

原创 递归算法篇

同时所有递归方法都可以用循环实现,通过 f(n) = f(n-1) + f(n-2) 会发现,只要保存前两次的结果,自底向上累加就可以得到最后的答案。解决方法:可以用HashMap保存计算过的数据,如果下次需要求解,可以直接从HashMap里面拿值。2、这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样。解题思路:题目和爬楼梯类似,最先想到用爬楼梯的解题方法解题。1、一个问题的解可以分解成几个子问题的解。解题过程:最先想到的是用递归方式。,因为里面有着大量的重复计算。3、存在基线/终止条件。

2023-05-08 16:32:33 50

原创 数据结构与算法学习

算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法;数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;

2023-05-08 11:47:36 43

原创 设计模式详解

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

2023-05-08 11:22:59 61

原创 多数据源管理方案

这种方式的核心是使用Spring提供的AbstractRoutingDataSource抽象类,注入多个数据源。@Component @Primary // 将该Bean设置为主要注入Bean public class DynamicDataSource extends AbstractRoutingDataSource {// 当前使用的数据源标识 public static ThreadLocal < String > name = new ThreadLocal < >();

2023-05-06 10:40:56 144

原创 Phaser详解

Phaser(阶段协同器)是一个Java实现的并发工具类,用于协调多个线程的执行。它提供了一些方便的方法来管理多个阶段的执行,可以让程序员灵活地控制线程的执行顺序和阶段性的执行。Phaser可以被视为和的进化版,它能够自适应地调整并发线程数,可以动态地增加或减少参与线程的数量。所以Phaser特别适合使用在重复执行或者重用的情况。多线程任务分配:Phaser 可以用于将复杂的任务分配给多个线程执行,并协调线程间的合作。

2023-05-05 12:18:53 970

原创 CyclicBarrier详解

(回环栅栏或循环屏障),是 Java 并发库中的一个同步工具,通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,可以被重用。以下是一些常见的多线程任务:CyclicBarrier 可以用于将复杂的任务分配给多个线程执行,并在所有线程完成工作后触发后续操作。数据处理:CyclicBarrier 可以用于协调多个线程间的数据处理,在所有线程处理完数据后触发后续操作。

2023-05-04 23:03:32 369

原创 AQS详解

所谓的AQS)提供了一套实现锁同步机制的框架,内部定义了很多锁相关的方法,JDK提供的大多数的同步器如Semaphore等都是基于AQS来实现的。一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法作用: 主要用于维护获取锁失败时入队的线程。head和tail分别指向同步等待队列的头和尾,同时同步等待队列是一个双向链表结构,每个节点都有前驱节点(prev)和后继节点(next/**/**用。

2023-05-04 22:05:00 224

原创 CountDownLatch详解

CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值(count),由于countDown方法的调用达到0,count为0之后所有等待的线程都会被释放,并且随后对await方法的调用都会立即返回。这是一个一次性现象 —— count不会被重置。

2023-05-01 13:29:28 243

原创 Semaphore详解

Semaphore(信号量)是一种用于多线程编程的同步工具,用于控制同时访问某个资源的线程数量。Semaphore维护了一个计数器,线程可以通过调用acquire()方法来获取Semaphore中的许可证,当计数器为0时,调用acquire()的线程将被阻塞,直到有其他线程释放许可证;线程可以通过调用release()方法来释放Semaphore中的许可证,这会使Semaphore中的计数器增加,从而允许更多的线程访问共享资源。

2023-05-01 00:36:02 292

原创 ReentrantLock详解

ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一个锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入它的主要应用场景是在多线程环境下对共享资源进行独占式访问,以保证数据的一致性和安全性。示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

2023-04-29 23:08:19 1433

原创 面试必问并发安全问题

1、死锁是必然发生在多操作者(M>=2 个)争夺多个资源(N>=2 个,且 N<=M)才会发生这种情况。很明显,单线程自然不会有死锁,只有 B 一个去,不要 2个,打十个都没问题;单资源呢?只有 13,A 和 B 也只会产生激烈竞争,打得不可开交,谁抢到就是谁的,但不会产生死锁。2、争夺资源的顺序不对,如果争夺资源的顺序是一样的,也不会产生死锁;3、争夺者对拿到的资源不放手。

2023-04-23 08:00:00 61

原创 RabbitMQ的安装

这时,可以使用默认的guest/guest用户登录。但是注意下,默认情况下,只允许在localhost本地登录,远程访问是无法登录的。Linux上的安装稍微复杂,需要有非常多的依赖包。简单起见,可以下载rabbitmq提供的zero dependency版本。安装完后可以使用 erl -version 指令检测下erlang是否安装成功。RabbitMQ的安装方式有很多,我们采用RPM安装包的方式。访问端口15672。这个语言包,在windows下的安装比较简单,是一个可执行程序,直接图形化安装就行了。

2023-04-22 10:38:27 212

原创 CAS&Atomic 原子操作详解

什么是原子性?相信很多同学在工作中经常使用事务,事务的一大特性就是原子性(事务具有 ACID 四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作 A 和 B都包含多个步骤,如果从执行 A 的线程来看,当另一个线程执行 B 时,要么将 B全部执行完,要么完全不执行 B,执行 B 的线程看 A 的操作也是一样的,那么 A和 B 对彼此来说是原子的。实现原子操作可以使用锁,锁机制。锁从性能上又分为乐观锁和悲观锁。

2023-04-22 08:00:00 226

原创 MQ介绍和比较

MQ:MessageQueue,消息队列。队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。

2023-04-21 12:17:24 178

原创 wait 和 notify

线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(what)和“怎么做”(How),简单的办法是让消费者线程不断地循环检查变量是否符合预期在 while 循环中设置不满足的条件,如果条件满足则退出 while 循环,从而完成消费者的工作。很自然的想法是,让消费者和生产者竞争一把锁,竞争到了的,才能够修改count 的值。

2023-04-20 12:53:38 56

最新版Java面试题(覆盖所有知识点)

有所有Java面试题,JVM面试题,MyBatis面试题,redis面试题,mysql面试题,netty面试题,多线程面试题,设计模式面试题,包括spring cloud微服务面试题,各种分布式中间件面试题,还有各种知识点脑图,覆盖十分广泛

2023-05-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除