随笔分类 -  Java

一些 Java 的相关内容
摘要:在 Java 的并发编程中,不可绕过的话题便是通过线程池的方式多线程或异步地处理任务,在线程池中,一个核心的参数是有关阻塞队列的选择,当提交的任务数使得核心线程无法足量处理这些任务时,会将这些任务放入阻塞队列中,如果阻塞队列也不能容纳新加入的任务,则会考虑创建超过核心线程数的线程。在实际开发中,根据 阅读全文
posted @ 2025-08-31 16:58 FatalFlower 阅读(21) 评论(0) 推荐(0)
摘要:为什么需要使用 CompletableFuture 在一些存在依赖关系的任务场景(task1 —> task2 —> task3),这些独立的任务可以通过线程池的方式执行,但是这样会存在以下几个问题: 由于任务之间存在依赖关系,因此有的线程在执行的过程中可能会阻塞,如果设置的线程池设置的不合理甚至会 阅读全文
posted @ 2025-07-13 15:13 FatalFlower 阅读(20) 评论(0) 推荐(0)
摘要:延时队列提供一种在指定时间后才能获取该元素的机制,这种机制一般用于如下的场景: 订单的自动取消 体验时间到期 商品评价的提醒 ………… 目前主要的延时队列实现包括 JUC 包下的 DelayQueue 以及通过 Redis 机制实现的 RDelayedQueue DelayQueue DelayQu 阅读全文
posted @ 2025-04-06 19:44 FatalFlower 阅读(31) 评论(0) 推荐(0)
摘要:简介 在线程的存活周期中,可能会需要一种绑定线程相关的局部变量的属性(如会话信息、参数信息等),一种可行的方式是对每个调用的方法所对应的参数对象进行封装,以使得参数能够按照对应的顺序进行传递。然而,在大部分的场景下,这种方式是不可行的,因为随着参数的增多,可能会使得方法变得更复杂,并且无法作为一个单 阅读全文
posted @ 2025-03-18 09:31 FatalFlower 阅读(41) 评论(0) 推荐(0)
摘要:在一般的应用开发过程中,合理的开发工作应当包含对相关功能的单元测试的编写,如何快速编写一个有效的单元测试有时也是一个值得考虑的问题。 Junit 测试 测试环境准备 在 Spring 项目中,可以使用 Junit 创建一个 test 的应用上下文,并执行对应的单元测试 比如,如果存在如下的服务类 U 阅读全文
posted @ 2024-11-23 18:37 FatalFlower 阅读(62) 评论(0) 推荐(0)
摘要:前文 在某些场景下,使用 Spring 作为开发组件时,不可避免地需要使用到配置文件,然而,对于配置文件中的某些敏感数据(如密码等信息字段),如果使用明文的方式,则可能在一定程度上导致信息泄露。为此,需要一种有效的方式来对这些字段进行加密处理,当前主流的一种加密方式就是 Jasypt 基本使用 对于 阅读全文
posted @ 2024-07-07 17:01 FatalFlower 阅读(694) 评论(0) 推荐(1)
摘要:在一般的 Spring 应用中,如果底层数据库访问采用的是 MyBatis,那么在大多数情况下,只使用一个单独的数据源,Spring 的事务管理在大多数情况下都是有效的。然而,在一些复杂的业务场景下,如需要在某一时刻访问不同的数据库,由于 Spring 对于事务管理实现的方式,可能不能达到预期的效果 阅读全文
posted @ 2024-01-08 21:21 FatalFlower 阅读(2237) 评论(1) 推荐(3)
摘要:一般来讲,在使用 MyBatis 进行数据库的访问时,通常会遇到需要更新数据的相关业务,在某些业务场景下,如果需要进行一批次的数据更新,可能性能不是特别理想。本文将简要介绍几种能够高效地处理批量更新数据的实现方式 单语句的批量更新 在某些业务场景下,可能更新的到的数据都在同一个表中,关联到的业务也是 阅读全文
posted @ 2023-12-13 21:23 FatalFlower 阅读(3495) 评论(0) 推荐(0)
摘要:问题起因 Spring 的 JDBC 相关的依赖库已经提供了对 JDBC 类事务处理的统一解决方案,在正常情况下,我们只需要在需要添加事务的业务处理方法上加上 @Transactional 注解即可开启声明式的事务处理。这种方式在单线程的处理模式下都是可行的,这是因为 Spring 在对 @Tran 阅读全文
posted @ 2023-09-19 08:32 FatalFlower 阅读(958) 评论(0) 推荐(0)
摘要:作为常见的 ORM 框架,在使用 MyBatis 的过程中可以针对相关的查询进行缓存处理以提高查询的性能。本文将简要介绍一下 MyBatis 中默认的一级缓存和二级缓存,以及自定义缓存的处理 MyBatis 中存在的缓存结构如下图所示: 一级缓存 MyBatis 默认开启一级缓存,在对应的配置类中即 阅读全文
posted @ 2022-09-27 21:46 FatalFlower 阅读(368) 评论(0) 推荐(0)
摘要:Spring 提供了十分强大的依赖注入功能,使得我们不再需要手动去管理对象的依赖项。然而,在实际的使用场景中,可能会遇到类似下面的依赖异常: Exception encountered during context initialization - cancelling refresh attemp 阅读全文
posted @ 2022-09-10 21:45 FatalFlower 阅读(137) 评论(0) 推荐(0)
摘要:在执行访问数据库相关的操作中,特别是针对数据的修改操作,由于对于数据的修改可能会出现异常,因此对于整个一组的数据修改实际上都不能算是生效的,在这种情况下,需要使用事务的 “回滚” 来撤销本次执行的操作;而在执行成功之后,需要手动将这一组操作提交给数据库管理系统,使得对于数据的修改能够生效,这种操作在 阅读全文
posted @ 2022-08-17 22:15 FatalFlower 阅读(695) 评论(0) 推荐(1)
摘要:在 Java 应用程序中,时间对象是使用地比较频繁的对象,比如,记录某一条数据的修改时间,用户的登录时间等应用场景。在传统的 Java 编程中,大部分的程序员都会选择使用 java.uti.Date 这个类型的类来表示时间(这个类可不是什么善类)。 在现代化互联网的使用场景中,由于前后端分离的原因, 阅读全文
posted @ 2022-06-25 20:50 FatalFlower 阅读(2600) 评论(0) 推荐(0)
摘要:一般来讲,通常使用的 HashMap 不是线程安全的,因为没有任何机制来保证每个操作的原子性。在 ConcurrentHashMap 出现之前,可以通过给 HashMap 的每个操作加上唯一的互斥锁来保证每个操作的线程安全性,这也是 HashTable 的实现方式。但是这种方式很笨拙,并且性能较低, 阅读全文
posted @ 2022-02-25 16:48 FatalFlower 阅读(76) 评论(0) 推荐(0)
摘要:本文将简要分析一下关于 Spring Eureka 相关的一些必要的源代码,对应的版本:Spring Cloud 2021.0.1 @EnableEurekaServer 注解 @EnableEurekaServer 注解标记当前的应用程序作为一个注册中心,查看 @EnableEurekaServe 阅读全文
posted @ 2022-02-25 16:47 FatalFlower 阅读(124) 评论(0) 推荐(0)
摘要:单体应用存在的问题 在传统应用程序中,一般都会将整个的应用程序作为一个单独的可执行文件部署到相应的服务器上执行。一般的应用程序结构可能如下图所示: 这种方式的优点很明显,比如:架构简单,服务之间调用逻辑清晰,服务部署方式也比较简单等等。 但是也有一些显而易见的缺点: 随着项目的需求变多,整个项目的复 阅读全文
posted @ 2022-02-25 16:45 FatalFlower 阅读(70) 评论(0) 推荐(0)
摘要:Map 定义的是键值对的映射关系,一般情况下,都会选择 HashMap 作为具体的实现,除了 HashMap 之外,另一个使用到的比较多的 Map 实现是 TreeMap HashMap 构造函数 HashMap 存在四个构造函数,对应的源代码如下所示: // 设置初始容量和装载因子 public 阅读全文
posted @ 2022-02-16 21:41 FatalFlower 阅读(52) 评论(0) 推荐(0)
摘要:在 Java 中,主要存在以下三种类型的集合:Set、List 和 Map,按照更加粗略的划分,可以分为:Collection 和 Map,这些类型的继承关系如下图所示: Collection 是集合 List、Set、Queue 等最基本的接口 Iterator 即迭代器,可以通过迭代器遍历集合中 阅读全文
posted @ 2022-02-16 11:01 FatalFlower 阅读(133) 评论(0) 推荐(0)
摘要:注解的本质 在 java.lang.annotation.Annotation 接口中有这样的描述: The common interface extended by all annotation interfaces. 大致意思就是所有的注解接口都继承自该 Annotaion 接口 假设现在我们编 阅读全文
posted @ 2022-02-14 10:35 FatalFlower 阅读(876) 评论(0) 推荐(0)
摘要:任务的创建与执行 在多线程的编程环境中,理想的情况是每个任务之间都存在理想的边界,各个任务之间相互独立,这样才能够享受到并发带来的明显的性能提升,并且,由于每个任务之间如果都是独立的,对于并发的处理也会简单许多。 一般情况下,显式地创建一个线程,启动一个任务会调用以下的构造函数创建一个 Thread 阅读全文
posted @ 2021-12-15 21:39 FatalFlower 阅读(56) 评论(0) 推荐(0)