
Java
文章平均质量分 89
庄隐
业精于勤荒于嬉
展开
-
源码阅读系列——Object源码阅读
在 Java 中,Object类占据着独特地位,它是所有 Java 类的根类。这意味着,Java 中的每一个类,无论是否被开发者显式声明,都默认继承自Object类。这种设计赋予了 Java 语言高度的统一性和强大的通用性,使得所有对象都能共享Object类提供的基础特性。原创 2025-02-24 07:30:00 · 769 阅读 · 0 评论 -
深入剖析JDK源码之Arrays.sort排序算法
自定义排序时,常需实现Comparator接口,其中compare方法返回值意义重大,规定返回负数、0、正数分别对应首元素小于、等于、大于次元素。一旦刻意不返回 0,比如在某些复杂逻辑下持续返回非零值,当排序元素数量超过 32 个时,很可能触发内部校验异常。因为排序算法在某些优化分支或稳定性保障环节,依赖正确的相等关系判断,缺少准确的 “相等” 反馈,数据顺序就可能错乱,最终导致程序抛出难以预料的异常。i < 33;i++) {@Override// 错误示范,从不返回0-1 : 1;})原创 2025-01-09 22:29:45 · 1008 阅读 · 0 评论 -
Idea开发代码注释规范
注释风格:尽量保持注释简洁明了,避免过多的冗余信息。注释应该遵循一致的风格,例如使用英文标点符号和空格。注释更新:当代码发生变化时,确保相应的注释也得到更新,以保持代码和注释的一致性。原创 2024-08-16 07:15:00 · 491 阅读 · 0 评论 -
JDK源码——String相关
String类别不可变字符串可变字符串可变字符串与同步性能因为不可变,拼接字符串效率较低,每次拼接都会生成新的String对象。在单线程中,相比String效率更高,因为可以直接在原字符串上进行修改,不需要创建新对象。由于添加了同步,所以在多线程环境中是安全的,但在单线程中比StringBuilder慢。线程安全线程安全,因为是不可变的不是线程安全的线程安全修改方式不能被修改可以被修改可以被修改常见用途适用于少量字符串操作和值的比较适用于大量字符串操作且不需要考虑线程安全的场景。原创 2024-08-16 07:15:00 · 830 阅读 · 0 评论 -
JDK源码——ThreadLocal
remove(): 移除当前线程的局部变量值。调用此方法后,当前线程将不再持有任何局部变量值。set(T): 为当前线程设置一个新的局部变量值。参数T是要设置的值的类型。get(): 获取当前线程的局部变量值。返回类型为T。withInitial(Supplier): 创建一个新的ThreadLocal实例,其初始值由提供的Supplier提供。这个方法返回一个新的ThreadLocal对象,其类型为S。原创 2024-08-14 07:15:00 · 965 阅读 · 0 评论 -
JDK源码——线程安全的双端队列
和都是 Java 集合框架中的双端队列实现。它们都允许在两端插入和移除元素,并且是线程安全的。原创 2024-08-14 07:15:00 · 759 阅读 · 0 评论 -
JDK源码——同步类
初始化:创建一个CountDownLatch实例时,需要指定一个计数器(count)的值。这个值表示需要等待的操作数量。减少计数器:当一个操作完成时,调用CountDownLatch的countDown()方法,将计数器的值减1。阻塞等待:在计数器值为0之前,调用await()方法的线程会被阻塞。一旦计数器的值变为0,所有等待的线程将被唤醒并继续执行。重置:CountDownLatch没有提供重置计数器的方法。如果需要重新开始等待,需要重新创建一个新的CountDownLatch实例。原创 2024-08-12 07:15:00 · 967 阅读 · 0 评论 -
JDK源码——线程安全的队列
clear()方法没有参数且返回类型为void,意味着它不返回任何值;element()方法同样没有参数,但返回类型为E,表示它返回队列中的元素;extends E>)方法接受一个集合作为参数,并且返回类型为boolean,表示它将多个元素添加到队列中并返回操作是否成功;remove()方法返回类型也是E,但它从队列中移除并返回头部元素;add(E)方法接受一个元素作为参数,返回类型为boolean,表示它尝试将元素添加到队列中并返回是否成功。原创 2024-08-12 07:15:00 · 1335 阅读 · 0 评论 -
JDK源码——locks包(二)
这是一个实用工具类,提供基本的线程阻塞原语,如park()和unpark(),用于创建自定义的同步机制。原创 2024-08-10 08:00:00 · 752 阅读 · 0 评论 -
JDK源码——locks包(一)
这是一个抽象类,提供了锁的拥有者信息。它主要是为了创建具有所有权功能的同步器,例如信号量和事件计数。:这是一个受保护的方法,用于设置当前拥有独占访问权限的线程。传入一个线程对象作为参数,如果传入null,则表示没有线程拥有访问权限。:这是一个受保护的方法,用于获取当前拥有独占访问权限的线程。如果没有线程拥有访问权限,返回null。这是一个为一系列所设计的抽象框架,比如信号量、事件等,其中操作长整型值。它提供了一个基于FIFO的阻塞队列,可以用于构建锁定和相关的同步器。原创 2024-08-10 07:30:00 · 1216 阅读 · 0 评论 -
JDK源码——Atomic包(三)
允许你原子地更新一个引用类型的变量。这意味着在多线程环境下,你可以安全地更新这个引用,而不会导致不一致或者竞态条件的问题。它通常用于实现简单的并发数据结构,如原子计数器、状态标志等。是一个泛型类,用于实现一个线程安全的引用类型。原创 2024-08-09 07:15:00 · 1199 阅读 · 0 评论 -
JDK源码——Atomic包(二)
允许对指定类的实例中的int类型字段进行原子更新。这意味着在多线程环境下,你可以安全地更新这个字段,而不会导致不一致或者竞态条件的问题。原创 2024-08-09 07:15:00 · 1034 阅读 · 0 评论 -
JDK源码——Atomic包(一)
Atomic包是Java在并发编程中的重要工具,它利用CAS(Compare-And-Swap)机制保证操作的原子性,同时避免了重量级锁的使用,提高了并发性能。Atomic包中的类通过底层处理器提供的原子指令实现,但不同的CPU架构可能提供的原子指令不同,有时可能需要某种形式的内部锁,因此不能绝对保证线程不被阻塞。原创 2024-08-08 23:23:08 · 861 阅读 · 0 评论 -
JVM手册——JVM相关配置
通过这个选项,你可以设置一个目标,使得应用程序在垃圾收集上花费的时间占总运行时间的比例尽可能小。:这个选项提供了更详细的垃圾收集日志,包括每一代的回收情况、回收所花费的时间、以及堆的使用情况等。这些选项允许开发者和系统管理员根据应用的具体需求和性能目标,精细地控制并行和并行压缩收集器的行为,从而优化应用的性能和响应时间。这些选项允许开发者和系统管理员根据应用的具体需求和性能目标,精细地控制CMS收集器的行为,从而优化应用的性能和响应时间。正确的线程数可以提升收集效率,减少垃圾收集对应用的影响。原创 2024-08-08 07:15:00 · 624 阅读 · 0 评论 -
Java HotSpot虚拟机中的内存管理手册阅读笔记
并行收集器是为充分利用多核CPU服务器而设计的,它通过并行执行垃圾收集任务来提高应用程序的吞吐量。尽管它可以减少年轻代收集的暂停时间,但在老年代收集时仍可能面临较长的暂停。因此,它适合那些可以容忍暂停的批量处理型应用程序。在选择垃圾收集器时,应根据应用程序的具体需求和运行环境来决定是否使用并行收集器。原创 2024-08-07 23:29:08 · 819 阅读 · 0 评论 -
Java多线程学习——JDK工具篇
四种常见的线程池分别是:newCachedThreadPool:创建一个可缓存的线程池,它会根据需要创建新线程,但如果线程空闲时间超过60秒,则会被回收。这种类型的线程池适用于执行大量短期异步任务的场景。newFixedThreadPool:创建一个固定大小的线程池,所有线程都是核心线程。当线程池中的线程都在执行任务时,新的任务会等待队列中的任务完成后再执行。这种类型的线程池适用于执行长期运行的任务。原创 2024-08-07 07:15:00 · 615 阅读 · 0 评论 -
Java多线程学习——原理篇
重排序是指编译器、运行时或处理器为了优化指令的执行顺序,而对代码中的指令进行重新排序的过程。重排序的主要目的是提高代码的执行效率,例如通过更好地利用CPU资源和减少阻塞时间。Happens-before原则是JMM中用于定义操作之间顺序的一项规则,它保证了操作的可见性、有序性和原子性。原创 2024-08-06 07:15:00 · 822 阅读 · 0 评论 -
Java多线程学习——基础篇
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但可以访问同属进程下的所有资源。协程则是一种用户级的轻量级线程,完全由用户控制,上下文切换速度快,开销小。:进程是计算机程序关于某个数据集的一次运行活动,是操作系统资源分配和调度的独立单位。每个进程都拥有独立的内存空间,进程间的切换开销较大,但相对安全和稳定。:线程是进程中的一个实体,它不拥有系统资源但可访问进程资源。同一进程内的多个线程共享内存和资源,线程间的切换开销较小。原创 2024-08-06 07:15:00 · 921 阅读 · 0 评论 -
Java8文档阅读——工具篇
启动一个图形化控制台,用于监控和管理 Java 应用程序。jconsole的参数如下:-interval=n:设置更新间隔为n秒(默认为4秒)。-notile:初始时不平铺窗口(适用于两个或更多连接)。-pluginpath plugins:指定要搜索JConsole插件的目录或JAR文件列表。原创 2024-07-25 07:15:00 · 833 阅读 · 0 评论 -
Java并发编程实战读书笔记(四)
Java内存模型(JMM)是通过各种操作来定义的,包括对变量的读/写操作、监视器的加锁和释放操作,以及线程的启动和合并操作。JMM为程序中的所有操作定义了一个偏序关系,称为Happens-Before。要确保执行操作B的线程看到操作A的结果(无论A和B是否在同一个线程中执行),在A和B之间必须满足Happens-Before关系。如果两个操作之间缺乏Happens-Before关系,那么JVM可以对它们任意地重排序。原创 2024-07-24 07:30:00 · 528 阅读 · 0 评论 -
Java并发编程实战读书笔记(三)
在讨论并发编程和多线程处理的场景中,“为每个任务分配一个线程”这种策略存在一系列的不足,特别是在生产环境中需要创建大量线程时。:线程的创建和销毁过程需要时间和系统资源。这会导致处理请求的延迟,并增加JVM和操作系统的负担。对于需要处理大量轻量级请求的应用(如大多数服务器应用),为每个请求创建一个新线程会消耗大量计算资源。:活跃的线程消耗系统资源,尤其是内存。如果可运行的线程数量超过可用处理器的数量,一些线程将处于闲置状态。原创 2024-07-24 07:15:00 · 844 阅读 · 0 评论 -
Java并发编程实战读书笔记(二)
在设计线程安全的类时,确保数据的一致性和防止数据竞争是至关重要的。这通常涉及三个基本要素:确定构成对象状态的所有变量,明确约束这些状态变量的不变性条件,以及建立管理对象状态并发访问的策略。要确定构成对象状态的所有变量相对简单,但需注意状态应封装在对象内,避免外部直接访问导致数据不一致的风险。例如,一个银行账户类可能将其余额作为其状态变量。不变性条件则较为复杂,它定义了哪些状态转换是允许的。例如,银行账户的余额不能为负数。在没有充分了解对象的不变形条件与后验条件下,很难保证线程安全性。原创 2024-07-23 22:58:52 · 1148 阅读 · 0 评论 -
Java并发编程实战读书笔记(一)
线程安全性是指在多线程环境中,当多个线程同时访问某个类或资源时,该类或资源能够保持其正确性和一致性。为了确保线程安全,需要考虑以下几个方面:不变性条件(Invariant):在类的设计中,应该定义一些约束对象状态的不变性条件。这些条件确保了对象在任何时候都满足预期的状态。后验条件(Postcondition):在类的设计中,应该定义一些描述对象操作结果的后验条件。这些条件确保了操作完成后对象的状态是正确的。原子性(Atomicity):在多线程环境下,操作应该是原子性的,即要么全部完成,要么全部不做。原创 2024-07-23 07:30:00 · 760 阅读 · 0 评论 -
使用ReentrantLock和Semaphore实现单任务执行多线程唤醒
在多线程环境中,我面临一个挑战:执行一段资源密集型的业务逻辑,该逻辑仅需要同步执行一次。为了高效地处理这种情形,我的策略是确保在众多线程中,仅有单一线程负责执行这项任务,而其他线程则在等待这一过程完成后直接退出,无需再次执行相同的业务代码。原创 2024-06-21 07:30:00 · 1097 阅读 · 0 评论 -
Arthas Profiler 事件监控场景介绍
通过上述场景的介绍,可以看出Arthas提供的一系列Profiler功能非常强大,它们允许开发者在不修改代码和不重启服务的情况下,实时地监控和分析Java应用程序的运行状态,从而高效地定位和解决生产环境中的问题。通过设置间隔定时器,分析了晚间8点至10点之间的方法调用数据,发现了几个影响加载性能的瓶颈方法,并在后续进行了优化。假设一个在线购物平台在促销期间遭遇性能瓶颈,通过监控CPU使用情况,发现订单服务中的一个复杂查询方法消耗了大量CPU资源,进一步优化该方法的查询逻辑,解决了性能问题。原创 2024-06-06 23:33:52 · 1078 阅读 · 0 评论 -
Arthas使用教程——日常常用命令
命令通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。您提供的是关于Java方法性能监控的维度和参数说明。原创 2024-06-06 07:15:00 · 1229 阅读 · 0 评论 -
Arthas使用教程——JVM常用命令
介绍Arthas中JVM常用命令原创 2024-06-03 07:30:00 · 1828 阅读 · 0 评论 -
源码剖析之@Scheduled与ThreadPoolTaskScheduler
`@Scheduled` 是 Spring 的注解,用于标识方法作为定时任务,根据 cron 表达式或其他时间间隔策略执行。而 `ThreadPoolTaskScheduler` 是 Spring 提供的调度器,管理线程池执行定时任务。二者结合,前者标注任务,后者负责按计划分配线程执行任务,保证并发处理及资源优化。通过源码分析,`ScheduledAnnotationBeanPostProcessor` 处理 `@Scheduled` 注解,转化为可调度任务提交至 `ThreadPoolTaskSchedu原创 2024-03-29 07:30:00 · 1029 阅读 · 0 评论 -
HikariCP入门
HikariCP是一款注重速度与稳定性的Java数据库连接池工具。它通过减少锁竞争、优化数据结构和精准定时任务,实现了超快的连接获取与释放速度。核心特性包括:极速性能、按需延迟初始化连接、实时监控与健康检查、全面支持JDBC 4.1/4.2特性、灵活配置与扩展性强。在Spring Boot等框架中易于集成,只需配置连接信息即可启用。通过对连接超时、空闲超时、心跳检测等关键参数的调整,开发者能够有效管理连接资源,提高应用程序与数据库交互的效率和稳定性。原创 2024-03-27 07:15:00 · 1125 阅读 · 0 评论 -
Docker入门
Docker为现代软件工程带来了革命性的改变,极大地提升了开发效率和运维体验。希望这篇入门文章能帮助你打开Docker世界的大门,深入学习和探索这个强大的工具,将其运用到实际工作中,提升你的工作效率和项目质量。而要真正掌握Docker,还需要在实践中不断尝试和学习,结合具体的业务场景来深化理解。原创 2024-03-26 07:30:00 · 882 阅读 · 0 评论 -
Spring Cloud 入门教程
Spring Cloud 入门介绍原创 2024-03-25 07:15:00 · 710 阅读 · 0 评论 -
分布式事务
分布式事务处理的关键在于保证跨多个节点的事务ACID属性。2PC协议通过准备和提交两阶段确保一致性,但存在单点故障、阻塞等问题。3PC协议加入预提交阶段以减少阻塞,但仍面临网络分区风险。TCC模式将事务拆解为Try、Confirm、Cancel三步,灵活处理业务与补偿逻辑,但实现复杂度高。Saga模式通过一系列子事务和补偿操作实现最终一致性,虽不保证强一致性,但适用异步场景,且具备较好的扩展性。各类方案均有优劣,应根据实际业务需求选择合适的分布式事务处理机制。原创 2024-03-24 15:20:25 · 1031 阅读 · 0 评论 -
H2数据库详解
H2数据库是一款轻量级、跨平台的开源Java数据库,支持嵌入式与服务器两种模式运行。可用于单一应用内部存储、开发测试阶段或作为小型项目的数据存储方案。具备丰富的数据类型(如字符、数值、日期、JSON等)和兼容多种数据库的模式(如MySQL、PostgreSQL等)。它拥有内嵌、内存、文件及服务器等多种运行模式,并内置Web控制台便于管理和操作。支持标准SQL语法,提供事务处理、并发控制、安全性保障及性能优化等功能,广泛应用于单元测试、临时数据存储及简易部署场景。原创 2024-03-23 08:15:00 · 2474 阅读 · 0 评论 -
从零开始:Spring Boot+Mybatis高效集成H2数据库教程
从零起步,本教程详细展示了在Spring Boot项目中整合Mybatis与H2数据库的全过程。首先配置依赖,包括Spring Boot、Mybatis和H2,并在application.properties设置数据源。接着指导如何配置Mybatis以实现Java接口与SQL映射文件绑定,并演示如何使用H2内存数据库及Web控制台进行数据管理。通过实战示例展示CRUD操作,同时介绍启动时自动执行初始化脚本的方法。最后,强调了这一组合在快速开发与测试中的高效性与便捷性。原创 2024-03-23 08:00:00 · 4565 阅读 · 2 评论 -
Raft共识算法
Raft算法是一种简洁且易于理解的分布式一致性协议,其核心在于领导者选举、日志复制与状态机应用。在每个任期中,节点通过竞选成为领导者,并定期发送心跳维持领导权。领导者接收客户端请求,将操作以日志条目形式追加到本地,并同步给跟随者,当大多数节点确认后提交该日志。为解决存储和恢复效率问题,Raft引入了快照机制压缩历史数据。此外,它通过严格的日志匹配规则有效处理冲突,确保集群内部各节点的日志一致,最终实现分布式系统的一致性。原创 2024-03-21 07:30:00 · 1310 阅读 · 1 评论 -
RocketMQ5.2.1版本数据落盘FlushCommitLogService源码阅读
`FlushCommitLogService`在RocketMQ 5.2.1版本中扮演关键角色,它是负责消息从内存高效持久化到磁盘的核心服务。根据配置的刷盘策略(`FlushDiskType`),构造方法会选择合适的刷盘服务实现:同步模式下使用`GroupCommitService`进行批量刷盘以优化磁盘I/O;异步或实时模式则启用`FlushRealTimeService`,依据时间间隔或系统内部设定触发刷盘动作。原创 2024-03-21 07:15:00 · 899 阅读 · 0 评论 -
微服务架构的设计原则及实践指南
微服务架构是一种设计方法论,旨在通过拆分大型单体应用为小型、独立、松耦合的服务来提高系统的可维护性和可扩展性。关键设计原则包括服务自治,即每个服务独立运作并拥有私有数据;接口契约化,确保服务间通信的标准化和一致性;去中心化治理,使服务能够自主决策而不受整体系统限制;容错与韧性,保障系统在部分组件失败时仍能继续运行;数据一致性,确保跨服务操作的数据整合正确无误;DevOps文化,推行开发与运维的紧密合作和自动化流程。这些原则共同支撑起一个灵活、高效且可靠的微服务系统,帮助企业快速适应市场变化和技术进步。原创 2024-03-20 07:15:00 · 1176 阅读 · 0 评论 -
理解Reactor设计模式
Reactor模式以其实现的高效性、可扩展性和灵活性,成为了现代高性能服务器系统设计的重要手段之一。理解并掌握Reactor模式,不仅有助于我们设计出更优的服务器架构,也能有效提升系统在面对高并发场景下的处理能力,为构建稳定、高效的网络服务提供强大的支持。原创 2024-03-20 07:15:00 · 885 阅读 · 0 评论 -
深入理解Java中的ThreadLocal
Java中的ThreadLocal提供了线程隔离的数据存储方式,每个线程通过ThreadLocal访问的是各自独立的变量副本。这在多线程应用中特别有用,例如用于维护线程内的数据库连接、用户身份信息等。一个典型的应用场景是在Web服务器中管理请求的上下文。由于每个请求通常由一个独立线程处理,使用ThreadLocal可以确保每个请求拥有自己的上下文数据,如请求参数、用户身份验证信息等,而不会与其它请求混淆。原创 2024-03-09 07:30:00 · 959 阅读 · 0 评论 -
Java类加载器原理
通过阅读《JVM实战》,我亲自探究了Java类加载机制的核心原理,尤其是双亲委派模型的重要性。在实践中,了解到当运行Java程序并首次引用类时,JVM会遵循严格的类加载流程:从加载(ClassLoader读取字节码至方法区)、验证、准备、解析到初始化等步骤。双亲委派模型确保类加载的统一性,即类加载请求先由父加载器处理,仅在其无法找到时才交予子加载器。书中实例还揭示了打破这一模型的特例及其应用场景。这一深入了解有助于优化和解决Java应用中的类加载问题。原创 2024-03-19 07:15:00 · 1057 阅读 · 0 评论