Java 21 全新 Virtual Threads 教學|JDK 21 虛擬執行緒與 Thread Pool 比較

Virtual Threads 是 JDK 21 正式推出的輕量執行緒,讓 JVM 在少數 OS thread 上多工跑大量虛擬執行緒,不用再靠加大 thread pool 來撐高並發 IO。這篇從 Platform Thread 的瓶頸講起,整理 carrier thread 的 mount / unmount 機制、API 用法、pinning 問題與 JDK 24 的改善,附 Spring Boot 整合設定與常見陷阱。

Java 版本演進|從 Java 8 到 25 的語言進化史

從 Java 8 的 Lambda 與 Stream,到 Java 25 的 virtual threads、stream gatherers、compact object headers,整理 Java 8、11、17、21、25 五個 LTS 的釋出時間、特色功能、各家 OpenJDK 發行版的免費支援到期日,順便提一下 2026 年 3 月剛 GA 的非 LTS Java 26 帶來什麼新東西。給還在 Java 8 / 11 想升級的開發者一份對照地圖。

Spring Data JPA與Hibernate報錯failed to lazily initialize a collection

在Java使用Spring或是Hibernate時,使用OneToMany、ManyToMany來標注Entity Class非常方便,可以輕鬆處理外來鍵與外來資料表的問題。但偶爾使用getXXX()方法要讀取外來資料表的時候,可能會遇到Hibernate報錯說「org.hibernate.LazyInitializationException: failed to lazily initialize a collection」,本篇文章將解析為什麼會發生這種問題,以及要怎麼解決它。

使用Java擷取檔案副檔名、判斷檔案類型(不用第三方套件)

本篇教學文章示範如何使用Java不透過第三方套件來判斷檔案的副檔名,以及檔案類型,只需要Java 7的NIO就可以達成,再加上Java 8的Optional與Stream API來更優雅的處理。使用原生的API可以避免一些問題,例如執行時還需要第三方套件、第三方套件還包含太多用不上的API徒增檔案大小、第三方套件不更新可能有漏洞等麻煩。

Java 17新增的sealed、non-sealed class與final class差別

一個Java Class的可用性有四種狀態,分別是public、protected、(無標示)、private,但可否被繼承的設定卻只有無標示與final兩種。從Java 17開正式推出sealed class / interface,有些人將sealed翻譯為彌封類別,或是密封類。sealed是用來限制類別繼承與介面實作做的對象,解決「都可以繼承,要不就是都不能繼承的問題。

使用Spring Data JPA建立公版的DAO、Repository樣板

Spring Data JPA是一個非常方便的資料庫Connection與Mapping的框架,它可以幫你建立資料表、添加資料表的欄位、維護連接池、將Java物件轉換為Table資料。有時候我們會希望自己建立一個我們的公版interface,讓他繼承某一個Repository再添加一些方法,然後之後的DAO interface再繼承我們的公版interface,可以簡化更多程式碼。