A service runs thousands of virtual threads, each doing blocking I/O inside a small synchronized cache-update block. Throughput collapses under load. What is the most precise root cause?
Object lock = new Object();
void handle() {
synchronized (lock) {
// blocking network/DB call while holding the monitor
var data = client.blockingFetch();
cache.put(key, data);
}
}