Erlang represents the strongest implementation of the actor model, with separate process heaps, copied messages, and single-owner mailboxes. Yet even this gold standard of isolation-based concurrency cannot escape the four classic failure modes of shared mutable state: deadlock (circular gen_server:call chains), memory leaks (unbounded mailbox growth), ordering races (nondeterministic message interleaving), and protocol violations (untyped messages). Erlang's mitigations—OTP conventions, monitoring, timeouts, pobox—are effective but rely entirely on programmer discipline rather than language enforcement. Performance pressure then forces the introduction of ETS, persistent_term, atomics, and counters—all shared mutable state outside the process model—reintroducing the exact bugs isolation was meant to prevent. Static analysis of OTP's own libraries found previously unknown race conditions clustered around ETS, process registration, and process dictionary usage. The conclusion: any concurrency model that achieves safety through isolation will eventually face a safety-vs-performance tradeoff, and in production, performance tends to win.
Table of contents
The Best CaseThe Familiar ProblemsThe MitigationsThe BottleneckThe Escape HatchThe ConsequencesThe PatternSort: