Spokes.wiki Search About
Defined Term mechanism updated Thu Aug 06 2026 00:00:00 GMT+0000 (Coordinated Universal Time)

Concurrency model

What a language offers for doing more than one thing at a time, and what it makes impossible. The founding sources split five ways, which is more disagreement than they show on any other axis.

Nothing built in. c leaves concurrency to the platform. Threads arrive as a library and a convention, and every guarantee is the programmer’s.

CSP-shaped. go builds in goroutines and channels: cheap tasks that communicate by passing values rather than sharing memory. The pitch on its own page is scale — “scalable, cloud-based servers” — and the model is the reason Go’s users cluster around network services, microservices and CLIs.

Isolated processes with supervision. elixir inherits BEAM’s actor model: lightweight processes that share nothing, communicate by message, and are watched by supervisors that restart them. The resulting claim is qualitatively different from Go’s. Go says concurrency is cheap; Elixir says failure is expected and recoverable, which is a claim about fault tolerance that happens to be delivered by the concurrency design.

Single-threaded event loop. nodejs runs one thread of JavaScript over non-blocking I/O, adding worker threads for the cases that need parallelism. Concurrency here is a property of the runtime, not the language — the sharpest illustration of why hosted-language matters.

Immutability plus transactions. clojure takes the problem away rather than scheduling it: values are immutable, so sharing across threads is safe by construction, and coordinated change goes through software transactional memory instead of hand-written locks. php added fibers for cooperative concurrency within a request-shaped execution model.

No data races, statically. rust is the odd one: it does not supply a concurrency runtime so much as a guarantee, using the same ownership rules that manage memory to reject programs with data races at compile time.

Two additions, 2026-08-06. erlang is the host beneath elixir‘s entry, and its own page sells the same processes, messages and built-in distribution as properties of the runtime — with hot code loading on top, which no other source here contemplates. And haskell arrives with software transactional memory over lightweight threads, the first time a mechanism in this corpus appears twice: clojure made the same choice on the JVM. Immutability plus transactions is now a position two independent languages hold, not one language’s idiosyncrasy.

The axis under the five

Two questions separate them. Where does isolation come from — from the runtime giving you separate heaps (elixir), from the compiler proving you cannot share wrongly (rust), from the data being immutable (clojure), or nowhere (c)? And what does the language do when a concurrent part fails — only Elixir’s page answers that at all, and its answer, supervision, is why the same design sells telecom-grade reliability and embedded control.

programming-language · go · elixir · erlang · haskell · clojure · rust · nodejs · memory-management-model · evaluation-strategy · synthesis