Cloud Album
面向海外用户的私有云相册,围绕备份、整理和订阅体验持续打磨。
从真实产品研发出发,记录 iOS 客户端、MinIO 存储、海外支付与增长实验的完整过程。
产品
把技术文章沉淀成产品能力,也把产品研发过程继续写成文章。
面向海外用户的私有云相册,围绕备份、整理和订阅体验持续打磨。
从真实产品研发出发,记录 iOS 客户端、MinIO 存储、海外支付与增长实验的完整过程。
技术博客
本教程介绍垃圾收集如何与 Hotspot JVM 配合使用的基础知识。了解垃圾收集器的功能后,了解如何使用 Visual VM 监控垃圾收集过程。最后,了解 Java SE 7 Hotspot JVM 中可用的垃圾收集器。 理解 GC 应先区分对象是否可达、何时触发回收以及收集器如何移动对象。实际优化的第一步是采集日志和指标,而不是盲目增大堆内存。
ubuntu20.04 快速安装kubernetes Ubuntu 20.04 和文中 Kubernetes 版本可能已进入旧维护阶段,命令不能直接套用于所有新版本。部署前应核对版本兼容矩阵,并为控制平面和 etcd 制定备份方案。
AbstractQueuedSynchronizer提供一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同步器(semaphores(信号量),events(事件)等)。
AQS 是 ReentrantLock、Semaphore、CountDownLatch 等并发工具的基础。阅读源码时应围绕状态获取失败后入队、线程挂起、前驱释放后唤醒这条主线理解。
Thread t = new Thread(new Runnable() {
@Override
public void run() {
}
});
t.start();
上面这段代码在JVM中是如何实现的呢?
调用 Thread.start 与直接调用 run 完全不同,前者会请求 JVM 创建新的执行线程。分析线程创建失败时应同时检查进程线程数、系统限制、容器配额和单线程栈大小。
接着上一篇mybatis 3.5.x源码系列(1) 我们继续研究一下mybatis的配置读取 MyBatis 将 SQL 执行拆分为多个职责明确的组件,并通过插件机制在关键接口处拦截。分析源码时应结合实际 SQL 和断点观察对象创建与调用顺序。
阅读 MyBatis 源码可以从一次 Mapper 方法调用向内追踪:代理如何确定 MappedStatement、参数如何转换、执行器如何发起 JDBC 请求。先掌握主链路,再分析缓存和插件更清晰。
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
回文字符串从中心向两侧对称,可以分别以单个字符和相邻两个字符作为中心扩展。该方法空间开销低,并能自然处理奇数与偶数长度回文。
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。 中位数问题的核心是找到合并后左半部分与右半部分的正确分界。简单合并易于验证,二分解法复杂度更优,但必须谨慎处理空数组、奇偶长度和哨兵边界。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 暴力枚举会重复检查大量子串,滑动窗口可以让左右边界只向前移动。遇到重复字符时,左边界不能后退,应跳到该字符上次出现位置的下一位。
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 这道题的关键是像手算加法一样从低位到高位遍历两个链表,并持续保存进位。实现时要覆盖链表长度不同、最后仍有进位和节点为空的情况。