- 博客(84)
- 资源 (1)
- 收藏
- 关注
原创 高并发下的计数器,为什么阿里不推荐使用 AtomicLong
LongAdder 是 JDK1.8 由 Doug Lea 大神新增的原子操作类,位于 java.util.concurrent.atomic 包下,LongAdder 在高并发的场景下会比 AtomicLong 具有更好的性能,代价是消耗更多的内存空间。LongAdder 是 Google 开源的一个高性能计数器实现。它采用了一种分段锁的策略,将一个 long 型的变量分割成多个 16 字节的段,每个段都使用一个独立的 AtomicLong 进行更新。
2025-06-04 14:14:38
910
原创 常用工具网站
https://github.com/dail8859/NotepadNext/releases
2025-06-04 13:33:48
76
原创 synchronized实现原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法进入临界区,同时还可以保证共享变量的内存可见性。
2025-05-30 13:45:18
635
原创 springboot文件上传下载
SpringBoot中,类型可以精确控制HTTP响应,为文件下载提供完善的HTTP头信息。• 完全控制HTTP响应和头信息• 适合各种资源类型的下载• 支持动态生成的文件下载• 需要精确控制HTTP响应的场景• 动态生成的文件下载• 自定义缓存策略的文件服务。
2025-05-30 11:17:41
650
原创 多线程的一些概念
两个或两个以上的线程持有不同系统资源的锁,线程彼此都等待获取对方的锁来完成自己的任务,但是没有让出自己持有的锁,线程就会无休止等待下去。线程竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。如上图所示,Thread-1持有资源Object1但是需要资源Object2完成自身任务,同样的,Thread-2持有资源Object2但需要Object1,双方都在等待对方手中的资源但都不释放自己手中的资源,从而进入死锁。
2025-05-29 11:29:18
548
原创 ReentrantReadWriteLock读写锁
读取锁和写入锁都支持锁获取期间的中断;Condition支持。仅写入锁提供了一个 Conditon 实现;读取锁不支持 Conditon ,readLock().newCondition() 会抛出 UnsupportedOperationException。
2025-05-28 14:12:54
286
原创 volatile底层原理详解
Java语言规范对于volatile定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致性地更新,线程应该确保通过排它锁单独获得这个变量。首先我们从定义开始入手,官方定义比较拗口。通俗来说就是但是它并不能保证多线程的原子操作。这就是所谓的线程可见性。。
2025-05-28 13:50:12
725
原创 Yavi用一行代码实现各种复杂验证
适用于任何对象的约束。包括Java Beans、Records、Protocol Buffers、Immutables等。支持API,以及结合验证结果和验证器的功能,融入了函数式编程的概念。类型安全的约束,不支持的约束不能应用于错误类型。在创建对象前对参数进行验证。
2025-05-23 16:55:54
151
原创 import*的展开(开发工具)
Java社区和许多编码规范(如Google Java Style)推荐明确导入所需的类,而不是使用通配符导入。很多IDE(如 IntelliJ IDEA、Eclipse)在自动补全功能上对于明确导入的类支持更好,使用。明确的导入语句有助于快速了解类的依赖关系,便于管理和修改。隐藏了实际使用的类,其他开发者在阅读代码时需要额外查找具体使用了哪些类,增加了理解代码的难度。虽然现代编译器和JVM对导入语句的处理非常高效,但在大型项目中,过多的。可能导致编译器无法明确识别要使用的具体类,进而引发编译错误。
2025-04-24 17:38:16
461
原创 在线正则网站
Github 地址:https://github.com/CJex/regulex。地址:https://jex.im/regulex/#!flags=&re=
2025-02-21 11:26:54
187
原创 红包算法实现
微信红包的分配算法通过将额度范围设置为这种设计既符合数学逻辑,也满足了用户体验的需求,是一种非常巧妙的算法设计。下面是一个基于 Java 的实现,用于模拟微信红包的分配算法。该算法的核心思想是:每次随机生成一个金额,范围在之间,同时确保总金额能够合理分配。
2025-02-20 10:43:25
208
原创 如何利用 Java 在线生成 PDF 文件
iText,对,没错,它就是我们今天的主角。iText是著名的开放源码站点一个项目,是用于生成PDF文档的一个java类库,通过iText不仅可以生成PDF或rtf的文档,而且还可以将XMLHtml文件转化为PDF文件。iText目前有两套版本,分别是iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理的地方。iText7是后来官方针对iText5的重构,两个版本差别还是挺大的。
2025-02-17 14:16:10
603
原创 为什么数据库和数据库连接池不采用类似java nio的IO多路复用技术使用一个连接来维护和数据库的数据交换?
传统的阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(大部分情况下一个连接即可)。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以Netty为核心。至于这些事件的处理方式,到底是业务代码循环着处理、丢到队列里,还是交给线程池处理,由业务代码决定。对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。在网络服务中,IO多路复用起的作用是。
2024-12-25 16:51:07
425
原创 Spring Boot整合EasyExcel并行导出及Zip压缩下载
这种方案特别适合需要处理大量数据导出的企业系统,在提升效率的同时,保证了系统的稳定性和可扩展性。首先,我们需要引入相关的依赖,包括 Spring Boot 和阿里巴巴的 EasyExcel 组件,此外还需要使用 Java 的 Zip 工具进行压缩操作。通过使用并行处理,可以同时生成多个文件。在这个例子中,假设我们有一个订单表,我们将导出每个用户的订单信息到不同的 Excel 文件中。:假设我们要导出上百万条订单数据,首先需要根据用户或其他条件将数据进行分片,每片数据导出到不同的 Excel 文件。
2024-12-13 11:16:35
717
原创 StreamingResponseBody:处理大批量数据导出
这种方式非常适合处理大文件下载、大批量数据导出等场景,因为它可以避免一次性加载所有数据到内存中,从而减少内存占用并提高性能。我们将采用StreamingResponseBody来实现流式响应,同时结合分页查询和异步处理。以下是带有详细注释的优化实现。Spring框架中,StreamingResponseBody 是一个接口,:只在需要时加载数据,并立即发送给客户端,减少了对服务器内存的压力。:数据可以分块地发送给客户端,而不是等待整个文件准备完毕。:用户无需长时间等待,文件开始生成后即可逐步接收到内容。
2024-12-06 15:44:28
890
原创 解决 attempt to unlock lock, not locked by current thread by node id redisson异常
3.多线程竞争的问题,当第一个线程完成lock,此时并未 unlock,第二个线程未获取到锁,但执行finally,第二线程尝试着去释放第一个线程的锁。就是问题的翻译如下:尝试去释放不是当前线程持有的锁。2.多线程竞争的问题,当第一个线程完成lock,此时并未 unlock,如此,第二个线程尝试获取锁,并进行lock操作,会抛出该异常。1.当你在完成lock后,里面的业务代码执行时间大于lock时间时,进行unlock,会抛出该异常。为什么会这样,由于在进行lock操作时,会设置一个时间默认30s,
2024-10-29 15:49:37
877
原创 实体与DTO如何转换
它是一个代码生成器,它基于约定优于配置的方法,极大地简化了 Java Bean 类型之间的映射实现。生成的映射代码使用简单的方法调用,因此执行速度快、类型安全且易于理解。另一方面,它是一个运行时库,用于实例化和调用生成的映射器。它采用基于约定的方法,同时提供简单、重构安全的应用程序接口(API)来处理特定用例。这里添加了Order到OrderDto转换的映射,将Order中的orderAmount映射到OrderDto中的money。在Spring环境下,建议配置如下的Bean以方便我们进行转换。
2024-10-22 10:24:34
474
原创 synchronized为什么会有两个monitor exit
于是线程就会释放锁。因为文章开头已经说过,这是由于Java在多个线程同时访问同一个对象的成员变量的时候,每个线程都拥有了这个对象变量的拷贝。代码如果遇到了这个标识,就表示获取到了对象的监视器monitor(monitor对象是由C++实现的),这个获取的过程是排他的,也就是同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。在多线程之间,共享变量的值是线程不安全的,因为线程在开始运行之后都会拥有自己的工作空间,而从自己工作空间把修改的值刷新回主存的时候需要CPU的调度。
2024-09-05 13:45:43
458
原创 天书般的Tree工具类
3.1 JAVA中树形对象的定义在JAVA中树形结构是通过对象嵌套方式来定义的,如MenuVo对象中有一个子对象subMenus:3.2 JSON数据格式中的树形结构JSON数据天然就是树形结果,如以下展示一个简单的JSON树形结构: TreeUtil代码分析直接看这神一样的方法makeTree():是不是完全看不懂?像看天书一样?makeTree方法为了通用使用了泛型+函数式编程+递归,正常人一眼根本看不这是在干什么的,我们先不用管这个makeTree合成树的代码原理,先直接
2024-08-15 14:39:11
887
原创 线程池常见问题
9)MemorySafeLinkedBlockingQueue:而且 LinkedBlockingQueue 默认是使用 Integer.MAX_VALUE 作为容量的,也就是个无界队列,可能会有发生 OOM 的风险,所以自己实现了一个内存安全的 MemorySafeLinkedBlockingQueue,可以配置最大剩余内存,当内存达到该值的时候,再往队列放任务就会失败,很好的保证了不会发生令人头疼的 OOM 问题。这公式太偏理论化了,很难实际落地下来,首先很难获取准确的等待时间和计算时间。
2024-08-12 13:53:52
801
原创 @PathVariable使用
通常请求的路径变量是在Controller层被捕获并处理的。如果你希望在Service层或其他非Controller组件中获取这些路径变量,而不是通过参数传递的方式,你则可以通过如下的方式。为使映射正确工作,捕获 URI 变量 {id} 的名称必须与 @PathVariable 成员参数 String id 相同。默认情况下@PathVariable路径变量是必须,否则服务端将。在类和方法级别访问URI 变量。注解来访问捕获的 URI 变量。下面的示例展示了如何使用。
2024-08-12 11:23:27
201
原创 读取jar文件方式
为了更好的模拟我们实际生产中的环境,我们直接通过Controller层来对jar中的文件进行访问。,这在某些场景下非常有用。Spring框架提供了。
2024-08-12 10:40:27
371
原创 微服务下保证事务的一致性
定义:在单体应用中,我们执行多个业务操作使用的是同一个连接,操作同一个数据库,操作不同表,一旦有异常我们可以整体回滚。其实在介绍事务的定义中,也介绍了一部分本地事务。本地事务通过ACID保证数据的强一致性,在我们实际开发过程中,我们或多或少都使用了本地事务。例如,MySQL事务处理使用begin开始事务、rollback回滚事务、commit确认事务。事务提交后,通过redo log记录变更,通过undo log 在失败时进行回滚,保证事务原子性。
2024-08-02 16:23:06
1223
原创 TCP连接中客户端的端口号是如何确定的?
事实上很多我们平时遇到的问题都和这个端口选择过程相关,如果能深度理解这个过程,将有助于我们对这些问题的深刻理解。Cannot assign requested address 报错是怎么回事?一个客户端端口可以同时用在两条 TCP 连接上吗?还是让我们借助一段简单到只有两句的代码,从这个来讲起!
2024-07-30 13:55:41
1441
原创 深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力
Redis 服务器端只需要单线程可以达到非常高的处理能力,每秒可以达到数万 QPS 的高处理能力。如此高性能的程序其实就是对 Linux 提供的多路复用机制 epoll 的一个较为完美的运用而已。在 Redis 源码中,核心逻辑其实就是两个,一个是 initServer 启动服务,另外一个就是 aeMain 事件循环。把这两个函数弄懂了,Redis 就吃透一大半了。......// 启动初始化// 运行事件处理循环,一直到服务器关闭为止。
2024-07-30 13:52:24
731
原创 Nacos配置中心交互模型是 push 还是 pull
Nacos在做配置中心的时候,配置数据的交互模式是服务端推过来还是客户端主动拉的?客户端主动拉的!
2024-07-30 13:35:21
1015
1
原创 java锁的认识
自旋锁的定义:当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。ReentrantLock 是一把可重入锁,也是一把互斥锁,它具有与相同的方法和监视器锁的语义,但是它比 synchronized 有更多可扩展的功能。ReentrantLock 的可重入性是指它可以由上次成功锁定但还未解锁的线程拥有。当只有一个线程尝试加锁时,该线程调用。
2024-07-15 14:17:39
830
原创 Socket
这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装,之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的套接字,套接字收到请求后,会写入相应的信息,并且把状态改为正在连接。所以浏览器需要根据网址来查询服务器的 IP 地址,做这项工作的协议是 DNS,查询到目标主机后,再把目标主机的 IP 告诉协议栈,至此,客户端这边就准备好了。
2024-07-14 22:01:46
713
原创 MySQL 的 varchar
来看极限边界情况,innodb为了记录一下varchar真实存储多少个字节,最多分配2个字节的空间去记录,2个字节16个比特位,全部为1,最大能记录的数字是2^16-1是65535个,innodb最大能记录varchar占用的字节数就是65535个,utf8mb4字符集一个字符是最大是4个字节,65535 / 4 = 16383.75,只要varchar字符数不超过16383个,innodb就可以记录真实占用的长度L,再多就记录不了了!这20字节的空间存储的是分散行的地址和占用的字节数。
2024-07-14 21:21:53
794
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人