<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on Fulur</title><link>http://example.org/tags/java/</link><description>Recent content in Java on Fulur</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 30 Apr 2025 17:52:52 +0800</lastBuildDate><atom:link href="http://example.org/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring：SpringBoot 核心原理剖析与实战：从启动流程到自动装配</title><link>http://example.org/posts/java/spring/springboot-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E4%B8%8E%E5%AE%9E%E6%88%98/</link><pubDate>Wed, 30 Apr 2025 17:52:52 +0800</pubDate><guid>http://example.org/posts/java/spring/springboot-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E4%B8%8E%E5%AE%9E%E6%88%98/</guid><description>&lt;h2 id="一为什么要掌握-springboot-核心原理">一、为什么要掌握 SpringBoot 核心原理？&lt;/h2>
&lt;p>在大多数项目中，SpringBoot 几乎是标配。熟悉它的使用只是“基本功”，&lt;strong>理解它的核心机制&lt;/strong>，才能真正解决下面这些问题：&lt;/p>
&lt;ul>
&lt;li>SpringBoot 启动流程里，自动装配是怎么运作的？&lt;/li>
&lt;li>启动太慢怎么优化？哪一环卡住了？&lt;/li>
&lt;li>自定义 starter 要怎么写才不会和别人的冲突？&lt;/li>
&lt;li>自动装配出错怎么精准排查？&lt;/li>
&lt;li>为什么某些 Bean 明明写了却没生效？&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="二springboot-启动流程全览执行链路图解">二、SpringBoot 启动流程全览（执行链路图解）&lt;/h2>
&lt;p>SpringBoot 应用的启动是由 &lt;code>SpringApplication.run(...)&lt;/code> 触发的，下面是一张完整链路简图：&lt;/p></description></item><item><title>JUC：ConcurrentHashMap分段锁演进史：从JDK7到JDK8的革新之路</title><link>http://example.org/posts/java/juc/concurrenthashmap%E5%88%86%E6%AE%B5%E9%94%81%E6%BC%94%E8%BF%9B%E5%8F%B2/</link><pubDate>Tue, 29 Apr 2025 17:52:52 +0800</pubDate><guid>http://example.org/posts/java/juc/concurrenthashmap%E5%88%86%E6%AE%B5%E9%94%81%E6%BC%94%E8%BF%9B%E5%8F%B2/</guid><description>&lt;p>ConcurrentHashMap是Java并发编程中至关重要的线程安全容器，其设计演进体现了对高并发场景下性能与安全的极致追求。本文将从分段锁的起源、JDK7的实现缺陷，到JDK8的架构革新，全面解析其演进历程。&lt;/p></description></item><item><title>JUC：异步编程陷阱：CompletableFuture回调地狱解决方案</title><link>http://example.org/posts/java/juc/%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E9%99%B7%E9%98%B1completablefuture%E5%9B%9E%E8%B0%83%E5%9C%B0%E7%8B%B1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link><pubDate>Tue, 29 Apr 2025 17:52:52 +0800</pubDate><guid>http://example.org/posts/java/juc/%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E9%99%B7%E9%98%B1completablefuture%E5%9B%9E%E8%B0%83%E5%9C%B0%E7%8B%B1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid><description>&lt;h2 id="一回调地狱的典型症状">一、回调地狱的典型症状&lt;/h2>
&lt;p>当使用&lt;code>CompletableFuture&lt;/code>进行多级异步操作时，若采用传统的嵌套回调模式，代码会迅速失控：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">CompletableFuture&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">supplyAsync&lt;/span>&lt;span class="p">(()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fetchOrder&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">thenAccept&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">order&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">CompletableFuture&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">supplyAsync&lt;/span>&lt;span class="p">(()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">checkInventory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">order&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">thenAccept&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inventory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">CompletableFuture&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">supplyAsync&lt;/span>&lt;span class="p">(()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">calculatePrice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inventory&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">thenAccept&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">price&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">CompletableFuture&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">runAsync&lt;/span>&lt;span class="p">(()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sendNotification&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">price&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">});&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">});&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">});&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>问题诊断&lt;/strong>：&lt;/p></description></item><item><title>JVM基础：Java 虚拟机模型</title><link>http://example.org/posts/java/jvm/java-%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A8%A1%E5%9E%8B/</link><pubDate>Tue, 29 Apr 2025 17:52:52 +0800</pubDate><guid>http://example.org/posts/java/jvm/java-%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A8%A1%E5%9E%8B/</guid><description>&lt;p>Java 虚拟机（Java Virtual Machine，JVM）是 Java 技术体系的核心。它屏蔽了底层硬件和操作系统的差异，实现了“一次编写，到处运行”（Write Once, Run Anywhere）的跨平台特性。要想深入掌握 Java 性能优化、排查线上问题，理解 JVM 的内部结构是必不可少的一环。&lt;/p></description></item><item><title>JVM基础：Java 内存模型（JMM）全解析</title><link>http://example.org/posts/java/jvm/java-%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Bjmm%E5%85%A8%E8%A7%A3%E6%9E%90/</link><pubDate>Mon, 28 Apr 2025 17:52:52 +0800</pubDate><guid>http://example.org/posts/java/jvm/java-%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Bjmm%E5%85%A8%E8%A7%A3%E6%9E%90/</guid><description>&lt;h2 id="一引言为什么需要-java-内存模型">一、引言：为什么需要 Java 内存模型？&lt;/h2>
&lt;p>在单线程程序中，变量的读取和写入是直观且一致的。但一旦进入多线程环境，情况就复杂得多——一个线程对变量所做的修改，另一个线程可能&lt;strong>看不到&lt;/strong>，也可能&lt;strong>看到不一致的中间状态&lt;/strong>。更令人困惑的是，这种问题即使在没有显式锁的代码中也可能悄然发生。你写下的代码语义清晰、逻辑无误，但却因为“看不见的顺序”而出现诡异的 bug。&lt;/p></description></item><item><title>JVM基础：对象大小与 JVM 参数的关系详解</title><link>http://example.org/posts/java/jvm/%E5%AF%B9%E8%B1%A1%E5%A4%A7%E5%B0%8F%E4%B8%8E-jvm-%E5%8F%82%E6%95%B0%E7%9A%84%E5%85%B3%E7%B3%BB%E8%AF%A6%E8%A7%A3/</link><pubDate>Mon, 28 Apr 2025 16:52:52 +0800</pubDate><guid>http://example.org/posts/java/jvm/%E5%AF%B9%E8%B1%A1%E5%A4%A7%E5%B0%8F%E4%B8%8E-jvm-%E5%8F%82%E6%95%B0%E7%9A%84%E5%85%B3%E7%B3%BB%E8%AF%A6%E8%A7%A3/</guid><description>&lt;p>Java 中对象的实际占用内存大小不仅与类中定义的字段有关，还受到 JVM 参数（特别是与指针压缩和对齐策略相关参数）的直接影响。理解这些参数对对象大小的影响，有助于在实际项目中进行精准内存估算与优化。&lt;/p></description></item><item><title>JVM基础：对象布局实战：用 JOL 工具看看真实结构</title><link>http://example.org/posts/java/jvm/%E5%AF%B9%E8%B1%A1%E5%B8%83%E5%B1%80%E5%AE%9E%E6%88%98%E7%94%A8-jol-%E5%B7%A5%E5%85%B7%E7%9C%8B%E7%9C%8B%E7%9C%9F%E5%AE%9E%E7%BB%93%E6%9E%84/</link><pubDate>Sun, 27 Apr 2025 19:52:52 +0800</pubDate><guid>http://example.org/posts/java/jvm/%E5%AF%B9%E8%B1%A1%E5%B8%83%E5%B1%80%E5%AE%9E%E6%88%98%E7%94%A8-jol-%E5%B7%A5%E5%85%B7%E7%9C%8B%E7%9C%8B%E7%9C%9F%E5%AE%9E%E7%BB%93%E6%9E%84/</guid><description>&lt;p>纸上得来终觉浅，我们现在来用工具实战验证一下：&lt;strong>Java 对象在内存中到底长什么样？&lt;/strong>&lt;/p>
&lt;p>JDK 提供了一款由官方支持的内存分析利器 —— &lt;strong>JOL（Java Object Layout）&lt;/strong>，它能让我们像 X 光一样看穿对象的每一个字节。&lt;/p></description></item><item><title>JVM基础：Java对象的创建与内存布局：你以为的 new 不止 new</title><link>http://example.org/posts/java/jvm/java%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9B%E5%BB%BA%E4%B8%8E%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</link><pubDate>Sun, 27 Apr 2025 16:52:52 +0800</pubDate><guid>http://example.org/posts/java/jvm/java%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9B%E5%BB%BA%E4%B8%8E%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</guid><description>&lt;h2 id="你真的理解-new-吗">你真的理解 new 吗？&lt;/h2>
&lt;p>“Java 中创建一个对象，不就是 new 一下吗？”这是许多开发者对对象创建的第一印象。但如果你曾经在生产环境遇到内存泄漏、对象占用过大，或者面试时被问“对象在内存中长什么样”，你可能就会意识到，事情没有那么简单。&lt;/p></description></item></channel></rss>