
web后端开发
文章平均质量分 77
后端开发是指构建网站、应用程序或其他软件的背后的技术方面,主要负责处理应用程序的逻辑、数据存储和处理、安全性等方面
Dddddduo_
江苏省高中数学竞赛三等奖 阿里云认证专家博主 字节跳动青训营后端优秀奖
展开
-
深入理解 Java 静态代理 代码实现
在不改变原有方法的代码上 实现一个代理类。代理可以理解成是对一个方法的加强。首先我们要理解什么是代理。同时重写接口里面的方法。原创 2025-04-01 01:06:36 · 90 阅读 · 0 评论 -
类加载 双亲委派机制 源码解析Tomcat的类加载机制
我们常说的是 一个类的加载 第一步就是加载加载阶段 我们会将类的,class 文件加载到 JVM 里面在这个阶段JVM 会根据类的全限类名来获取定义该类的二进制字节流并且将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构这个加载过程会创建一个 java.lang.Class 类的实例来表示这个类这个 Class 对象作为的事程序中每个类的数据访问入口。原创 2025-04-01 00:22:11 · 898 阅读 · 0 评论 -
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
核心思想:创建相关或依赖对象的家族,无需指定具体类典型场景:跨平台UI组件、数据库访问套件// 抽象工厂// 具体工厂(Windows风格)// 具体工厂(Mac风格)// 产品体系public void paint() { System.out.println("Windows按钮");public void check() { System.out.println("Mac复选框");特点✅ 保证产品兼容性✅ 产品族一致性控制❌ 扩展新产品族困难。原创 2025-03-31 10:38:01 · 616 阅读 · 0 评论 -
JVM Java类加载 isInstance instanceof 的区别
instanceof关键字编译时需明确ClassA的类名(必须存在),否则编译失败。示例// trueClass类的方法支持运行时动态确定类型(通过反射或变量传递类名)。示例// true差异维度instanceof本质关键字Class类方法类型检查时机编译时静态运行时动态动态类型支持不支持支持(反射、泛型)代码灵活性固定类名类名可变量传递或反射获取通过合理选择两者,可以兼顾代码的简洁性与动态灵活性。原创 2025-03-29 12:01:44 · 651 阅读 · 0 评论 -
深入理解 Java 类加载机制
加载,这是由类加载器执行的,该步骤将查找字节码(通常在classpath所指定的路径中查找,但这并非是必需的),并从这些字节码中创建一个Class对象。链接。在链接阶段将验证类中的字节码,为静态域分布存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。初始化。如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。原创 2025-03-29 12:01:03 · 384 阅读 · 0 评论 -
linux删除文件 相关
rm(remove)是用于删除文件或目录的常用命令。rm [-dfirv][--help][--version][文件或目录...]。原创 2025-03-28 02:06:25 · 774 阅读 · 0 评论 -
Linux常见定时任务命令 系统级别的定时任务
crontab是一个常用的定时任务管理工具,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。通常,crond守护进程会在后台运行,每分钟检查是否有预定的作业需要执行。at命令用于设置在某个特定的时间点执行一次性的任务。原创 2025-03-28 02:05:27 · 488 阅读 · 0 评论 -
Linux常见docker命令整理 容器 镜像
在执行停止和删除容器的操作之前,了解 Docker 容器的不同状态十分重要。容器主要有以下几种状态,其中停止(Exited)状态表示容器已停止运行,但仍然存在于 Docker 主机上。在 Linux 系统中,若要停止并删除所有 Docker 容器,可按以下步骤进行,同时要注意这些操作可能需要管理员权限。除了删除容器外,还可以使用 Docker 的清理命令来释放其他未使用的资源,如镜像、网络和卷。使用以下命令列出所有正在运行的容器的 ID,然后通过。以安静模式列出所有容器(包括已停止的)的 ID,原创 2025-03-28 01:57:39 · 822 阅读 · 0 评论 -
Linux配置静态站点nginx
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序员伊戈尔·赛索耶夫(Igor Sysoev)开发,于 2004 年首次公开发布。它以其高并发处理能力、低内存消耗和稳定性而受到广泛关注和应用。原创 2025-03-27 01:47:13 · 886 阅读 · 0 评论 -
概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别
以上流程体现了RabbitMQ在消息可靠性、灵活路由和异常处理上的核心设计,实际应用中需根据业务场景组合配置参数。如需进一步了解 RabbitMQ 消息生命周期,可参考 关于消费模式的解析或 中的应答机制实验代码。若未持久化且服务崩溃可能丢失。已分配给消费者但未确认(队列中未分配给消费者(消费者未确认且连接中断。可能因队列未持久化丢失。原创 2025-03-07 16:20:42 · 809 阅读 · 0 评论 -
保姆级教程 在linux上启动Docker并且使用IntelliJ DockerCompose一键部署Springboot应用 常见命令
修改 docker.service 文件。Linux用户组是多个用户的集合,通过共享权限和资源访问规则实现集中管理。每个用户必须至少属于一个用户组,且系统中存在三种角色划分:● 文件所有者:创建文件的用户,拥有最高控制权;● 用户所在组:文件所属的默认组,组成员共享权限;● 其他组:既非所有者也不在文件所属组的用户。1. 权限控制用户组通过文件权限位(rwx)实现精细控制: ○ 文件权限分为所有者、所属组、其他组三部分(如 -rw-r--r--) ○ 通过 chmod 命令批量修改组权限(如原创 2025-03-25 12:22:25 · 732 阅读 · 0 评论 -
Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
在 Java 中,Deque 是一个双端队列接口,它继承自 Queue 接口,支持在队列的两端进行元素的插入、删除和访问操作。LinkedList 是 Deque 接口的一个实现类,下面介绍 Deque<Integer> deque = new LinkedList<>(); 常见的操作。原创 2025-03-22 21:54:34 · 505 阅读 · 0 评论 -
浅谈canal实例 在docker里面安装canal镜像 Canal监听MySQL数据库变更并同步更新Redis和Elasticsearch 示例
通过以上步骤,Spring Boot应用能够实时监听MySQL变更,并自动同步到Redis和Elasticsearch,保障数据一致性。原创 2025-03-20 21:27:54 · 585 阅读 · 0 评论 -
言简意赅 Linux部署elasticsearch7.15.2
byd折磨了我两天。原创 2025-03-19 21:26:16 · 467 阅读 · 0 评论 -
Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
基本定义高层模块不应依赖低层模块,两者都应依赖抽象(接口或抽象类)。抽象不应依赖细节,而细节(具体实现类)应依赖抽象。核心目标通过面向接口编程,打破传统“高层调用低层”的依赖关系,实现模块间解耦。例如:传统依赖:司机类直接调用奔驰车类的方法,导致更换车型需修改司机代码。倒置后:司机依赖“车辆接口”,奔驰车、宝马车均实现该接口,实现灵活扩展。基本定义高层模块不应依赖低层模块,两者都应依赖抽象(接口或抽象类)。抽象不应依赖细节,而细节(具体实现类)应依赖抽象。核心目标。原创 2025-03-17 07:37:01 · 884 阅读 · 0 评论 -
浅谈RabbitMQ Springboot3后终止自动注入服务 需要手写Bean并实例化bean(SpringBoot启动前) Could not autowire. No beans of ‘Rab
报错 Could not autowire. No beans of 'RabbitAdmin' type found.意思就是这个模版在高版本是需要自己去手写。手写 注册 Bean 注入。Spring 启动流程。原创 2025-03-09 16:29:08 · 107 阅读 · 0 评论 -
快速上手 代码详解 RabbitMQ简单实战 Spring框架下实现解耦 改造传统服务端代码
它就像是一个“调度员”,将接收到的请求进行初步处理后,调用 Service 层的相应方法来完成具体的业务逻辑。这一层是业务逻辑的核心处理层,负责对 Controller 层传递过来的请求进行具体的业务处理。它会调用 Dao 层的方法来获取所需的数据,并对数据进行必要的处理和转换。在这种方案中,Service 层不再直接将处理后的数据返回给 Controller 层,而是将数据发布到消息队列中,Controller 层再从消息队列中获取数据。监听到消息队列中有新的数据时,会将数据赋值给。原创 2025-03-07 16:42:25 · 581 阅读 · 0 评论 -
RabbitMQ控制台详解 中文讲解 软件工业化生产 rabbitmq-management 索引速查
rabbitmq-management是RabbitMq web管理端,用的是erlang的cowboy框架进行开发。web页面包括Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。转载 2025-03-07 16:14:23 · 23 阅读 · 0 评论 -
快速开始 | Springboot操作RabbitMQ太简单啦! 编写RabbitmqConfig 基于模版向下封装Service 跑通Junit测试
【Java代码】快速开始 | Springboot->消息队列RabbitMQ 编写RabbitmqConfig 基于模版向下封装Service 跑通Junit测试。原创 2025-03-07 14:26:11 · 343 阅读 · 0 评论 -
教程|如何在Windows操作系统上下载并安装MySQL8 并设置环境变量env
我的笔记本操作系统是 windows10 在这里。找到系统环境变量注册位置。在 cmd 窗口输入指令。类似于 我笔记本上的是。检测配置环境变量成功。原创 2025-03-06 14:24:54 · 528 阅读 · 0 评论 -
Java类加载机制 双亲委派机制 八股速记版
双亲委派机制通过层级化加载体系,确保了Java核心类库的安全性和系统稳定性,同时通过破坏委派的灵活机制,为复杂场景提供了扩展可能性。理解这一机制对诊断类冲突、版本兼容等问题具有重要意义。二、双亲委派机制详解。三、类加载器关键特性。原创 2025-03-02 23:23:17 · 434 阅读 · 0 评论 -
谈谈单例模式中通过Htools包的SpringUtil.getBean获取Bean的好处
这种模式在中间件开发、基础框架开发中较为常见,体现了对Spring容器的主动控制,而非被动依赖。的场景中非常实用,是解决框架整合时序问题的经典方案。由于单例的初始化早于 Spring 容器的初始化,,后续使用时必然抛出。原创 2025-03-02 23:20:51 · 1017 阅读 · 0 评论 -
Spring单例模式 Spring 中的单例 饿汉式加载 懒汉式加载
单例模式(Singleton Pattern)是一种,其核心目标是确保一个类,并提供全局唯一的访问点。它常用于资源控制(如数据库连接池、线程池)、配置管理、日志对象等场景。new。原创 2025-03-02 23:18:43 · 1023 阅读 · 0 评论 -
MyBatis-Plus 元对象处理器 @TableField注解 反射动态赋值 实现字段自动填充
对实体类的动态包装器,提供反射操作字段的能力(类似一个能透视对象内部结构的工具)填充策略枚举,包含 INSERT(插入时填充)、UPDATE(更新时填充)等。(避免每个插入操作都写 setCreateTime)(比如强制所有表统一使用同一时间生成规则)严格模式填充方法,确保字段存在且类型匹配。假设你每次保存订单时都要记录。(时间记录等通用操作集中管理)原创 2025-03-02 23:13:20 · 465 阅读 · 0 评论 -
题解 | 牛客周赛82 Java ABCDEF AK实录
其中可选的数是 排列的最大值n - 比重复数字小的数(不能填) -前面有多少数 (注意要把重复的数空下来)如果一个元素与前面这个元素不同 这个数就是确定的 而后面跟这个数相同的数就都是不确定的。数组的索引i 的值表示的是前 i 个元素最小的 m 个数的和。我们只需要统计这段重复的数字和可以填入的数字的排列组合就行。通过优先队列筛选出前 i 个元素数值大的元素并进行移除。优先队列采用的是大顶堆(数值大的元素优先级高)我们发现给出的元素只能是递减的。按照索引大小的规则来排序元素。重复的数我们计数出来的。原创 2025-03-02 00:30:25 · 665 阅读 · 0 评论 -
设计模式 工厂模式 工厂方法模式 抽象工厂模式
通过工厂方法设计模式,我们将文档创建的逻辑封装到工厂类中,使得客户端代码解耦了与具体产品的依赖,只关心工厂接口而不关心具体的产品类型。这使得系统在增加新的文档类型时非常灵活,只需要新增工厂类即可,无需修改现有的代码。原创 2025-02-26 15:22:05 · 1247 阅读 · 0 评论 -
Java类字节码 详解 深入浅出 面试题 用verbose工具查看字节码
首先,我会回顾Java字节码的基础知识,确保自己理解每个操作码的作用。例如,iconst_1将整数1压入操作数栈,istore_1将栈顶的int值存储到局部变量表的位置1。iload_1则是将局部变量位置1的值压入栈顶。这些基本操作需要正确理解才能分析整个流程。接下来,我需要分析方法的整体结构。方法foo()的返回类型是int,描述符为()I,访问标志为ACC_PUBLIC,说明这是一个公共方法。Code属性中给出了操作数栈的最大深度(stack=1),局部变量数量(locals=5),以及参数数量(a原创 2025-02-08 01:35:06 · 716 阅读 · 0 评论 -
Java并发编程 优化卖票案例 FieldUpdater 对象的属性修改原子类 以一种线程安全的方式操作非线程安全对象内的某些字段
无锁机制:compareAndSet方法通过CAS(Compare-And-Swap)操作实现原子更新,不需要加锁,减少了线程阻塞和上下文切换的开销。AtomicReferenceFieldUpdater:基于CAS的无锁机制,线程直接尝试更新,只有冲突时才会重试,避免了阻塞。AtomicReferenceFieldUpdater:在大多数情况下,CAS操作非常高效,尤其适合读多写少的场景。synchronized:基于锁的机制,线程需要等待获取锁才能执行临界区代码,可能导致阻塞。原创 2025-02-08 00:28:45 · 698 阅读 · 0 评论 -
并发编程 引用类型 原子类 Stamped和Markable atomicMarkableReference表单Ref和标记Markable 面试题
AtomicMarkableReference 是一个位于 java.util.concurrent.atomic 包中的类。它提供了一种原子性的方式来管理一个带有标记的引用。这在一些需要同时跟踪对象引用和一个标记状态的场景中非常有用,例如实现乐观锁机制或者在多线程环境下标记某个对象的特定状态。原创 2025-02-06 12:54:41 · 222 阅读 · 0 评论 -
Java并发编程 原子 Atomic 基本类型 CountDownLatch阻塞 数组类型 原子类 AtomicIntegerArray 看源码自我学习
类在多线程环境下的强大功能,它可以确保对数组的操作是原子的,从而避免数据竞争和不一致的问题。提供的方法可以确保在多线程环境下的操作是原子的,即不会发生数据竞争或不一致的问题。提供了一些基本的操作方法,如获取、设置、自增、自减等。)中的一个类,它提供了一种线程安全的方式来操作整数数组。与普通的整数数组不同,countDownLatch 会等线程完成一个后自减。以下是一个完整的示例,展示了如何使用。输出的结果会小于等于 50000。50 个线程去加 100 次。通过这些示例,你可以看到。原创 2025-02-06 12:53:48 · 586 阅读 · 0 评论 -
并发编程 CAS的缺点 ABA问题是什么 以及解决 版本号机制
但是已经是被 线程 1 修改成 101 后又改了回去。成功是成功的 但是不代表没有问题。发现不一样 本次操作会写不进去。线程 2、会以为还是 100。cas 原值和期望值是否一样。会存在 CPU 空转的问题。100 100 这个数值。杜绝 ABA 这种情况。传入整型数 表示版本号。我们有一种版本号机制。原创 2025-02-06 12:52:27 · 312 阅读 · 0 评论 -
并发编程 Java锁 自旋锁 原子引用类 AtomiacReference
自旋锁(spinlock)是一种在多线程或多进程环境下用于同步和控制并发访问共享资源的机制。它是一种繁忙的等待方式,当线程试图获取自旋锁时,如果锁已经被其他线程持有,那么这个线程不会进入睡眠状态,而是在一个循环中反复地检查(等待),直到锁可用为止。例如,在循环中通过执行类似空for循环这样无用的任务来保持活动状态,就像一个人在等待某个资源时不停地转圈查看是否可以获取一样,这也是“自旋”名称的由来1。原创 2025-02-06 12:51:40 · 621 阅读 · 0 评论 -
Java并发编程 CAS思想 底层原理 Unsafe类 不安全 并发原语 OpenJDK源码
volatile无原子性,会写丢Atomiclnteger 类主要利用 CAS(compare and swap)+ volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。volatile管不住,会写丢,因为写操作只会有一次,如果这次写操作和其他线程冲突了,就会无效但是CAS如果写不进去会一直循环,直到写进去为止。原创 2025-02-06 12:49:46 · 813 阅读 · 0 评论 -
Java并发编程面试题 重点 volatile变量的读写过程 可见性 无原子 禁重排 八步读取 四大内存屏障指令
线程t1中为何看不到被主线程main修改为false的flag的值?问题可能:1.主线程修改了fag之后没有将其刷新到主内存,所以t1线程看不到。2.主线程将faq刷新到了主内存,但是t1一直读取的是自己工作内存中fag的值,没有去主内存中更新获取fag最新的值。我们的诉求:1.线程中修改了工作内存中的副本之后,立即将其刷新到主内存:2.工作内存中每次读取共享变量时,都去主内存中重新读取,然后拷贝到工作内存。解决:使用volatile修饰共享变量,就可以达到上面的效果,被volatile修改原创 2025-01-26 02:12:28 · 721 阅读 · 0 评论 -
volatile之四类内存屏障指令 内存屏障 面试重点 底层源码
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。Java 操作内存的后门重排是为了优化性能而发生的一种行为,但在多线程环境中,若没有正确的同步机制,重排可能导致程序行为不一致,尤其是在共享数据的访问上。为了防止这类问题,我们通常会使用volatile。原创 2025-01-26 02:10:52 · 696 阅读 · 0 评论 -
JUC 复习和巩固 并发并行 Stream并行流 park能不能用interrupt打断 synchronized 和 lock 优势
parallel()实际上是基于来实现并行计算的。通过将数据划分为多个子任务并在多个线程上执行来提高性能。需要注意,并非所有操作都适合并行处理,应该根据具体情况进行优化。中使用之所以会导致线程不安全,主要是因为ArrayList(或其他常见的List实现类)并不是线程安全的。这意味着当多个线程同时执行add()操作时,可能会发生竞争条件(race condition),导致数据不一致或程序异常。在并行流中会导致线程不安全,因为ArrayList。原创 2025-01-26 02:10:17 · 933 阅读 · 0 评论 -
Java内存模型JMM happens-before关系 先行发生原则 八条原则 修复案例 总原则
一个unLock操作先行发生于后面((这里的“后面”是指时间上的先后))对同一个锁的lock操作;如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作;前面的写对后面的读是可见的,这里的“后面”同样是指时间上的先后。原创 2025-01-26 02:09:31 · 782 阅读 · 0 评论 -
结合计算机组成原理讲 Java内存模型JMM JMM规范下多线程对变量的读写过程
CPU 比内存速度快为了避免数据不一致性的问题就有 了 CPU 缓存Java 语言是跨平台的Java 虚拟机规范中试图定义一种 Java 内存模型 来屏蔽掉各种硬件和操作系统的内存访问差异 以实现让 Java 程序在各种平台下都能达到一致的内存访问效果我们习惯性认为代码执行顺序是从上到下有序执行处理器在进行重排序的时候必须考虑指令之间的数据依赖性图JMM 定义了线程和主内存之间的抽象关系线程之间的共享变量存储在主内存中(内存条)每一个线程都有一个私有的本地工作内存。原创 2025-01-26 02:08:54 · 290 阅读 · 0 评论 -
灵魂拷问 线程中等待唤醒机制 park() unpark() 如果要阻塞两次怎么办
问 如果我们在调用方法的时候 service 里面的业务线很长 我们是否可以开两个线程去处理 业务请求 使用阻塞唤醒的方式 决定先处理还是后处理?一个线程只能针对于一个线程发起一个 unpark。是一个及其消耗 CPU 的操作。多线程的上下文切换?非阻塞的 无锁化机制。原创 2025-01-23 02:01:14 · 375 阅读 · 0 评论 -
LockSupport类中的park等待和unpark唤醒
LockSuppont是用来创建锁和其他同步类的基本线程阻塞原语。线程等待推荐使用 park() unpark() 机制。这边等效是只发一个 unpark 通行证。阻塞当前线程 / 阻塞传入的具体线程。唤醒处于阻塞状态的指定线程。最多 1 个 最少 0 个。许可上限的累加是 1。原创 2025-01-23 02:00:38 · 232 阅读 · 0 评论