跳到主要内容
Apache王也道长

Apache王也道长

喜欢写一点代码,喜欢折腾

产品

正在打磨的产品

把技术文章沉淀成产品能力,也把产品研发过程继续写成文章。

开发中

Cloud Album

面向海外用户的私有云相册,围绕备份、整理和订阅体验持续打磨。

从真实产品研发出发,记录 iOS 客户端、MinIO 存储、海外支付与增长实验的完整过程。

iOS AppMinIO 存储海外订阅

技术博客

最新文章

Java 垃圾回收基础:GC Roots、分代模型、收集器与日志分析

· 阅读需 21 分钟
Apache王也道长
软件开发者与技术作者

目的

本教程介绍垃圾收集如何与 Hotspot JVM 配合使用的基础知识。了解垃圾收集器的功能后,了解如何使用 Visual VM 监控垃圾收集过程。最后,了解 Java SE 7 Hotspot JVM 中可用的垃圾收集器。 理解 GC 应先区分对象是否可达、何时触发回收以及收集器如何移动对象。实际优化的第一步是采集日志和指标,而不是盲目增大堆内存。

AbstractQueuedSynchronizer详解

· 阅读需 10 分钟
Apache王也道长
软件开发者与技术作者

AbstractQueuedSynchronizer提供一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同步器(semaphores(信号量),events(事件)等)。

AQS 是 ReentrantLock、Semaphore、CountDownLatch 等并发工具的基础。阅读源码时应围绕状态获取失败后入队、线程挂起、前驱释放后唤醒这条主线理解。

JVM 如何创建 Java 线程:Thread.start、Native 方法与操作系统线程

· 阅读需 3 分钟
Apache王也道长
软件开发者与技术作者
Thread t = new Thread(new Runnable() {
@Override
public void run() {

}
});
t.start();

上面这段代码在JVM中是如何实现的呢?

调用 Thread.start 与直接调用 run 完全不同,前者会请求 JVM 创建新的执行线程。分析线程创建失败时应同时检查进程线程数、系统限制、容器配额和单线程栈大小。

MyBatis 3.5 源码分析(一):配置解析、SqlSessionFactory 与 Mapper 代理

· 阅读需 3 分钟
Apache王也道长
软件开发者与技术作者
  1. 首先我们了解一下mybatis中的几个核心概念
  • Configuration 配置,可以理解为mybatis的大管家,管理一切
  • Environment 环境,这个主要负责数据源,事务管理器
  • MappedStatement mapper.xml对应的声明类,定义mapper中所有的标签,属性
  • Interceptor 拦截器,可以拦截Executor,ParameterHandler,ResultSetHandler,StatementHandler
  • SqlSessionFactory SQL会话管理工厂类
  • SqlSession SQL会话,定义了增,删,改,查,提交,回滚,获取java.sql.Connection,获取mapper
  • MapperProxy mapper代理类,生成接口代理对象
  • Executor 执行器,主要负责增,删,改,查,提交,回滚的执行
  • ParameterHandler 参数处理器,主要负责参数设置
  • ResultSetHandler 查询结果集处理器,用来封装ResultSet对应的结果
  • StatementHandler Statement处理器,用来执行Statement相应的操作

阅读 MyBatis 源码可以从一次 Mapper 方法调用向内追踪:代理如何确定 MappedStatement、参数如何转换、执行器如何发起 JDBC 请求。先掌握主链路,再分析缓存和插件更清晰。

leetcode 0005 最长回文子串

· 阅读需 2 分钟
Apache王也道长
软件开发者与技术作者

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

回文字符串从中心向两侧对称,可以分别以单个字符和相邻两个字符作为中心扩展。该方法空间开销低,并能自然处理奇数与偶数长度回文。

leetcode 0004 寻找两个有序数组的中位数

· 阅读需 5 分钟
Apache王也道长
软件开发者与技术作者

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。 中位数问题的核心是找到合并后左半部分与右半部分的正确分界。简单合并易于验证,二分解法复杂度更优,但必须谨慎处理空数组、奇偶长度和哨兵边界。

leetcode 0003 无重复字符的最长子串

· 阅读需 1 分钟
Apache王也道长
软件开发者与技术作者

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 暴力枚举会重复检查大量子串,滑动窗口可以让左右边界只向前移动。遇到重复字符时,左边界不能后退,应跳到该字符上次出现位置的下一位。

LeetCode 2 两数相加 Java 解法:链表遍历与进位处理

· 阅读需 2 分钟
Apache王也道长
软件开发者与技术作者

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 这道题的关键是像手算加法一样从低位到高位遍历两个链表,并持续保存进位。实现时要覆盖链表长度不同、最后仍有进位和节点为空的情况。

总访问量 -- · 访客数 --