自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Rain后台权限管理系统,快速开发

前端采用Vue3.x、Element UI。后端采用Spring Boot、Spring Security、Redis & Jwt。

2024-12-03 18:30:14 811

原创 项目集群部署定时任务重复执行......怎么解决???

2、使用分布式锁,使用redis setNX命令加lua脚本在定时任务执行的时候只让一个服务获取到锁,其他执行setNX命令返回false,实现只让一个服务去执行定时任务,保证健全性,并且使用WatchDog进行锁自动续期,添加本地标识保证每个服务只能释放自己所持有的锁。1、可以在部署时只让一个服务器上有定时任务模块,不过这样如果这台服务器宕机,就会导致整个定时任务崩溃。项目集群部署在不同服务器,导致定时任务重复执行。

2024-10-26 20:03:17 2918

原创 《面试最爱问的Spring》- IOC启动流程,底层实现、配置方式详解

Spring作为一款经典框架,并且作为Spring家族的老大哥,也是SpringBoot,SpringCloud的一个基石,在我们工作中使用频率非常高,所以深入了解Spring的实现就很有必要。IoC(或DI)是Spring框架的核心功能之一,是Spring生态系统的基础。

2024-10-26 19:53:44 4204

原创 Java Arrays工具类

直接进入正题,打开 Intellij IDEA,找到 Arrays 类的源码。“具体来说,数组操作可分为以下 9 种。“我们来一个一个学习。

2024-10-23 17:21:14 3453

原创 Java LinkHashMap源码分析

俗话说,“人无完人”,HashMap 也不例外,有一种需求它就满足不了,假如我们需要一个按照插入顺序来排列的键值对集合,那 HashMap 就无能为力了。那怎么办呢?必须得上今天这篇文章的主角:LinkedHashMap。同学们好啊,还记得那篇吗?我感觉写得非常棒,既通俗易懂,又深入源码,分析得透透彻彻、明明白白的。HashMap 哪哪都好,真的,只要你想用键值对,第一时间就应该想到它。为了提高查找效率,HashMap 在插入的时候对键做了一次哈希算法,这就导致插入的元素是无序的。

2024-10-23 17:07:54 3600

原创 Java实现CAS的原理

CAS(Compare-and-Swap)是一种乐观锁的实现方式,全称为“比较并交换”,是一种无锁的原子操作。在并发编程中,我们都知道i++操作是非线程安全的,这是因为i++操作不是原子操作常见的做法就是加锁。在 Java 中,我们可以使用 synchronized 关键字和CAS来实现加锁效果。是悲观锁,尽管随着 JDK 版本的升级,synchronized 关键字已经“轻量级”了很多,但依然是悲观锁,线程开始执行第一步就要获取锁,一旦获得锁,其他的线程进入后就会阻塞并等待锁。

2024-10-22 16:17:55 3675

原创 Optional指南,优雅解决空指针

Optional ,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了空指针,尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。当然了,我们程序员是富有责任心的,不会坐视不管,于是就有了大量的 null 值检查。尽管有时候这种检查完全没有必要,但我们已经习惯了例行公事。

2024-10-20 14:07:24 3859

原创 Spring AOP

AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章实战的方式使用 AOP 技术添加一个切面来实现接口访问的统一日志记录,进行公共字段填充。

2024-10-15 18:33:18 3644

原创 Vue3部署nginx服务器,遇到的坑......

然后启动nginx就可以访问项目了,不推荐使用该程序启动nginx,任务管理器关闭nginx,因为可能会导致缓存问题,从而导致更改的配置文件不生效。把dist文件夹拷贝放入html目录下。我的package.json下配置如下,使用 npm run build:prod 进行打包。在终端使用命令的方式启动nginx、关闭nginx可以解决缓存问题。然后进入conf目录下的nginx.conf配置文件中进行配置。找到配置,BASE_API此处要和nginx配置时保持一致。也可以自行去配置文件进行配置。

2024-10-14 18:39:58 3129

原创 StringUtils Java字符串工具类

在我们的代码中经常需要对字符串判空,截取字符串、转换大小写、分隔字符串、比较字符串、拼接字符串、使用正则表达式等等。如果只用 String 类提供的那些方法,我们需要手写大量的额外代码,不然容易出现各种异常。包下的工具类,给我们提供了非常丰富的选择。StringUtils 提供了非常多实用的方法。接下来,我们来拿一些常用的方法举例说明。

2024-10-13 19:25:18 3418

原创 POI百万数据处理版本不兼容

java: 不兼容的类型: org.apache.poi.xssf.model.SharedStringsTable无法转换为org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable。之前已经测试过的接口,今天突然发现报错了,于是重构项目看到底哪里错了。因为之前更换了版本,没有注意,发生了版本不兼容。发现类型不兼容,去看了源码,的确没有这个类型。于是想到了版本问题,赶紧看maven版本。更新为4.1.2解决问题。

2024-10-08 14:42:04 2959

原创 本地变量ThreadLocal怎么用?为什么会发生内存泄漏?

ThreadLocal是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。通常,我们会使用synchronzed 关键字或者lock来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁的线程进行阻塞,很显然,这种方式的时间效率不会特别高。线程安全问题的核心在于多个线程会对同一个临界区的共享资源进行访问。

2024-10-07 21:20:15 3511

原创 Java并发重入锁ReentrantLock

ReentrantLock 重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。

2024-10-06 21:55:30 4167

原创 synchronized性能很差?synchronized详解

synchronized它能用来同步方法和代码块,那 synchronized 到底锁的是什么呢?,Java 中的每一个对象都可以作为一个锁。Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应。这个 Class 对象被创建的时机是在 JVM 加载类时,由 JVM 自动完成。

2024-10-06 21:07:09 3542

原创 JVM内存模型详解

JDK(Java Development Kit)就是java 开发工具,从图中可以看到,JDK包含JRE,Java基础类库和Java工具,这是给开发者使用的产品。JRE(Java Runtime Environment)Java运行时环境,在运行java程序代码时,提供Java运行的所有环境集合,包括核心类库,JVM实现等,在安装jdk时,安装目录下会有一个jre的目录,jre目录下有一个lib目录和一个bin目录,lib目录中存放的是Java运行是所需要的核心类库,bin中的就是JVM的实现。

2024-10-05 16:38:49 4142

原创 BIO、NIO、AIO的区别

NIO(New I/O 或 Non-blocking I/O):使用非阻塞 I/O 模型,线程在等待 I/O 时可执行其他任务,通过 Selector 监控多个 Channel 上的事件,提高性能和可伸缩性,适用于高并发场景。异步非阻塞 I/O 模型:这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。IO,常写作 I/O,是 Input/Output 的简称,即输入/输出。最后,关闭文件通道。

2024-10-02 16:53:51 3641

原创 NIO,传统IO-->孰强孰弱

我这里先给大家展示一副传统 IO 和 NIO 的对比图,感受一下。传统IO基于字节流或字符流(如 FileInputStream、BufferedReader 等)进行文件读写,以及使用Socket和ServerSocket 进行网络传输。NIO 使用通道(Channel)和缓冲区(Buffer)进行文件操作,以及使用 SocketChannel和 ServerSocketChannel 进行网络传输。传统 IO 采用阻塞式模型,对于每个连接,都需要创建一个独立的线程来处理读写操作。

2024-10-02 16:42:50 3486

原创 Seate一站式分布式事务解决方案,真香......

原理介绍了那么多,很头疼?总的来说,两个注解打天下,入口方法使用@GlobabTransaction,内部方法,远程方法使用@Transaction。@Override// 1. 先基于订单编号查询订单对象,判断订单是否存在// 检查是否是当前用户在发起支付// 2. 判断订单状态是否为未支付if (!// 3. 封装请求积分支付 vo 对象// 4. 远程请求积分支付接口// 5. 判断远程是否支付成功// 6. 更新订单状态为支付成功// 7. 记录支付日志。

2024-10-01 16:57:12 3916

原创 启动项目要打开多个命令窗口,太麻烦

如果项目中使用了Redis缓存,Seate分布式事务,MQ消息中间件,Nacos注册中心等等,难道每次启动项目之前都要一个个启动吗?就没有什么简便的方法吗?第一条根据路径找到mq的bin目录,启动borker,并且后面可以写上配置,我就设置了端口以及自动创建主题。这样就不用每次跑项目都要一个一个文件夹去找服务,桌面bat文件一点直接起飞......对于分布式项目来说,可能会用到各种中间件,对于每一个中间件又要提前运行起来。但是对于不同文件夹下的Redis,Nacos呢?对,还有通过路径的方式哦!

2024-10-01 15:14:55 2998

原创 Java HashMap源码分析、hash 原理、扩容机制、加载因子、线程不安全

上一个问题提到了加载因子(或者叫负载因子),那么这个问题我们来讨论为什么加载因子是 0.75 而不是 0.6、0.8。我们知道,HashMap 是用数组+链表/红黑树实现的,我们要想往 HashMap 中添加数据(元素/键值对)或者取数据,就需要确定数据在数组中的下标(索引)。int h;数组的容量过小,经过哈希计算后的下标,容易出现冲突;数组的容量过大,导致空间利用率不高。加载因子是用来表示 HashMap 中数据的填满程度:加载因子 = 填入哈希表中的数据个数 / 哈希表的长度。

2024-09-30 15:03:57 4623

原创 Java线程池源码分析,深度解读

在传统的多线程编程中,每次需要执行任务时都会创建一个新的线程,任务执行完毕后再销毁该线程。这种方式存在一些问题,例如频繁创建和销毁线程会带来较大的开销,线程数量的不可控会导致系统资源的浪费和性能下降,所以可以采用池化技术来避免这样的性能开销。线程池管理一组线程,这些线程可以被任务复用,而不是每次都创建新的线程。线程池接收任务,并将任务分配给空闲的线程来执行。线程池可以根据需要动态调整线程的数量,以适应不同的负载情况。线程池提供了任务队列,用于存储尚未执行的任务,并根据需要进行排队和调度。

2024-09-28 21:07:14 4032 2

空空如也

空空如也

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

TA关注的人

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