只用 JDK,靠一个注解加反射写出小型测试运行器,用 –patch-module 测试包私有代码,再把 Java 服务发布成模块化 JAR、jlink 运行时镜像和 jpackage 安装包。
不用任何库,JDK 就能发起 HTTP 请求,也能提供 HTTP 服务。学会 HttpClient 的同步和异步用法,再用内置的 HttpServer 和虚拟线程搭一个小型 JSON 任务服务,状态码正确,关闭干净。
Java 能在少量操作系统线程上跑十万个阻塞任务。看懂虚拟线程怎样挂载和卸载、什么情况下仍会被固定、ScopedValue 为什么能取代 ThreadLocal,以及 StructuredTaskScope 怎样取消失败的工作。
Java 执行器用固定的线程池运行任务,并交回一个 Future。学会 submit、invokeAll、取消、CompletableFuture 链、超时、信号量和阻塞队列,每个示例的输出都稳定不变。
两个 Java 线程修改同一个变量,写入可能悄无声息地丢失。看清 count++ 为什么会竞态,synchronized、volatile、原子类和锁怎样修好它,以及怎样强制制造并检测死锁。
Java 把变量和对象放在哪里,垃圾回收器怎样决定释放什么,有垃圾回收的程序为什么照样会内存泄漏、内存耗尽,以及 JIT 为什么让代码越跑越快。
只用 javac、jar 和 java 搭一个双模块 Java 项目。看清包、导入、类路径、JAR 文件和 module-info.java 怎样配合,以及 Maven 和 Gradle 在此之上又多做了什么。
Java 允许任何引用为 null,缺失的值可能在远离源头的地方让代码崩溃。Objects 和 Optional 让缺失变得看得见,java.time 则要你说清是哪个时刻、在哪座城市。
Java 的 lambda 表达式把一小段行为变成值,流再把它们串成惰性的流水线。看看流水线到底怎样运行、该用哪些收集器,以及什么时候普通循环更好读。
泛型让编译器检查放进列表、盒子或方法里的是什么,然后在程序运行前把这些信息擦除。通过运行小程序,学会上下界、通配符、PECS,以及怎样读懂 JDK 的方法签名。