Core Java
-

Strings and Unicode: UTF-16, Compact Strings, and Why Emoji Break charAt
Java says a string has two characters, while your user sees exactly one. Both answers are correct, and that is…
Read More » -

JFR Event Streaming: Continuous Production Profiling Without a Vendor Agent
Your JVM already ships with a profiler that is safe for production. Since JDK 14, it can also talk to…
Read More » -

Mutation testing with PIT: why 100% coverage proves almost nothing
PIT (also called Pitest) is the usual mutation testing tool for the JVM. It generates mutants for you, using a…
Read More » -

LongAdder vs AtomicLong: Why a Single Counter Collapses Under Contention
A counter is the “hello world” of concurrent programming. Count requests, count cache hits, count bytes sent. One shared number,…
Read More » -

Flexible Constructor Bodies: Validating Before super()
Here’s a small confession. For years I wrote constructors that did their validation in the wrong place, and I knew…
Read More » -

Structured Concurrency: Why JEP 505 Changes How We Think About Cancellation, Not Just Syntax
A request comes in. Your service forks two calls, one for the user and one for their orders. The user…
Read More » -

Gson Deserialization and the InaccessibleObjectException
Gson is a popular Java library for converting JSON into Java objects and Java objects into JSON. While Gson works…
Read More » -

What’s New in Jackson 3?
Jackson 3 is a major release of the Jackson JSON processing library. Unlike a typical minor or patch upgrade, Jackson…
Read More » -

Structured Concurrency in Practice: ExecutorService vs StructuredTaskScope
Most Java concurrency bugs show up when something goes wrong, not when everything works. So let’s break one subtask on…
Read More »

