<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Java on BIT &amp; 42</title><link>https://CoderAmedal.github.io/tags/java/</link><description>Recent content in Java on BIT &amp; 42</description><generator>Hugo -- 0.160.1</generator><language>zh-CN</language><copyright>2025 Bit &amp;amp; 42. 这是生命、宇宙以及一切的终极版权声明</copyright><lastBuildDate>Sat, 14 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://CoderAmedal.github.io/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Java还有救吗？</title><link>https://CoderAmedal.github.io/posts/java-future/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/java-future/</guid><description>&lt;h1 id="java还有救吗"&gt;Java还有救吗？&lt;/h1&gt;
&lt;h2 id="这个问题背后的情绪"&gt;这个问题背后的情绪&lt;/h2&gt;
&lt;p&gt;每隔一段时间就会有&amp;quot;Java 已死&amp;quot;的讨论。坦白说，Java 确实有让人不爽的地方：代码冗长、启动慢、内存占用大、框架配置繁琐。和 Go 的简洁、Rust 的性能、Kotlin 的语法糖比起来，Java 显得有些老态龙钟。&lt;/p&gt;
&lt;p&gt;但我觉得这问题的前提就错了——&lt;strong&gt;语言不是用来比的，是用来干活儿的。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="java-真正的竞争力是什么"&gt;Java 真正的竞争力是什么&lt;/h2&gt;
&lt;p&gt;三个字：&lt;strong&gt;生态、人才、兼容。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="生态"&gt;生态&lt;/h3&gt;
&lt;p&gt;Spring Boot、MyBatis、Netty、Kafka、Elasticsearch、Hadoop、Flink……几乎所有中间件和基础设施都对 Java 有一流支持。这不是一朝一夕能追赶的。&lt;/p&gt;
&lt;h3 id="人才"&gt;人才&lt;/h3&gt;
&lt;p&gt;Java 开发者的存量是其他语言难以比拟的。一个公司如果用 Go 或 Rust 创业，招人的难度和成本都会显著高于 Java。不是每个人都能为技术品味买单。&lt;/p&gt;
&lt;h3 id="兼容"&gt;兼容&lt;/h3&gt;
&lt;p&gt;Java 的向后兼容性是业界标杆。十年前写的代码今天还能跑，这在一些业务场景中是无价之宝。银行、保险、政务这些行业的系统换代周期极长，Java 的稳定性就是核心竞争力。&lt;/p&gt;
&lt;h2 id="java-这几年的自救"&gt;Java 这几年的自救&lt;/h2&gt;
&lt;p&gt;Java 的演进速度最近明显加快了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 17/21 LTS&lt;/strong&gt;：稳定可靠的新时代基线&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟线程（Project Loom）&lt;/strong&gt;：彻底解决了&amp;quot;一个请求一个线程&amp;quot;的资源瓶颈，不需要再用 WebFlux 写回调地狱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record 类&lt;/strong&gt;：再也不用写 getter/setter/equals/hashCode 了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模式匹配 + switch 表达式&lt;/strong&gt;：语法表达力大幅提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valhalla（值类型）&lt;/strong&gt;：解决 &lt;code&gt;Integer&lt;/code&gt; vs &lt;code&gt;int&lt;/code&gt; 的装箱地狱，性能进一步提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Panama（外部函数和内存 API）&lt;/strong&gt;：告别 JNI 的噩梦&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虚拟线程是真正意义上的 game changer——它能在一个 JVM 实例上跑数百万个轻量级线程，与 Go 的 goroutine 正面对标，还不需要破坏现有的 &lt;code&gt;Thread&lt;/code&gt; API。&lt;/p&gt;</description></item><item><title>《Java 并发编程的艺术》个人总结</title><link>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</link><pubDate>Sat, 23 Mar 2024 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</guid><description>&lt;h1 id="java-并发编程的艺术个人总结"&gt;《Java 并发编程的艺术》个人总结&lt;/h1&gt;
&lt;h2 id="为什么读这本书"&gt;为什么读这本书&lt;/h2&gt;
&lt;p&gt;工作中写并发代码的机会不少——线程池、缓存、异步处理——但遇到诡异的可见性问题或死锁时，往往只能靠加 &lt;code&gt;synchronized&lt;/code&gt; 碰运气。这本书系统地梳理了 Java 内存模型和并发工具的设计原理，读完确实对调试并发问题有了更清晰的思路。&lt;/p&gt;
&lt;h2 id="核心知识点梳理"&gt;核心知识点梳理&lt;/h2&gt;
&lt;h3 id="1-并发编程的挑战"&gt;1. 并发编程的挑战&lt;/h3&gt;
&lt;p&gt;书中开篇说的三个核心问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文切换&lt;/strong&gt;：线程多了，CPU 花在切换上的时间比干活还多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死锁&lt;/strong&gt;：互相等对方的锁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源限制&lt;/strong&gt;：硬件瓶颈不解决，加再多线程也没用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经验上，&lt;strong&gt;线程数 ≈ CPU 核数 × 2（取决于 IO 密集还是计算密集）&lt;/strong&gt; 是一个比较可靠的起点。&lt;/p&gt;
&lt;h3 id="2-java-内存模型jmm"&gt;2. Java 内存模型（JMM）&lt;/h3&gt;
&lt;p&gt;这是全书最重要的一章。JMM 控制的是&lt;strong&gt;一个线程对共享变量的写入何时对另一个线程可见&lt;/strong&gt;。核心概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;happens-before 规则&lt;/strong&gt;：程序顺序、volatile、锁、传递性等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volatile&lt;/strong&gt;：保证可见性和禁止指令重排序，但不保证原子性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁&lt;/strong&gt;：&lt;code&gt;synchronized&lt;/code&gt; 和 &lt;code&gt;ReentrantLock&lt;/code&gt; 同时保证原子性和可见性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并发编程中大部分诡异 bug 的根因都是&lt;strong&gt;对 JMM 的理解不到位&lt;/strong&gt;——以为一个线程写完了另一个线程就一定能读到。&lt;/p&gt;
&lt;h3 id="3-并发基础组件"&gt;3. 并发基础组件&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;核心作用&lt;/th&gt;
&lt;th&gt;使用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;轻量级可见性保证&lt;/td&gt;
&lt;td&gt;状态标识位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;synchronized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;互斥 + 可见性&lt;/td&gt;
&lt;td&gt;临界区保护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReentrantLock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可中断/超时/公平锁&lt;/td&gt;
&lt;td&gt;需要灵活锁控制的场景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AtomicInteger/Long/Reference&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CAS 无锁原子操作&lt;/td&gt;
&lt;td&gt;计数器、状态机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CountDownLatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等待多个线程完成&lt;/td&gt;
&lt;td&gt;并行任务汇总&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CyclicBarrier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多个线程互相等待&lt;/td&gt;
&lt;td&gt;分阶段并行计算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Semaphore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流量控制&lt;/td&gt;
&lt;td&gt;限流、资源池&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="4-线程池"&gt;4. 线程池&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ThreadPoolExecutor&lt;/code&gt; 的核心参数关系：&lt;/p&gt;</description></item></channel></rss>