Single-threaded - Callbacks, Promises, Observables and async/await: vanilla JS
threading/multiprocessing, lock-based concurrency
protecting critical section vs. performance
Communicating Sequential Processes (CSP)
Golang or Clojure’s core.async.
process/thread passes data through channels.
Actor Model (AM): Elixir, Erlang, Scala
asynchronous by nature, and have location transparency that spans runtimes and machines - if you have a reference (Akka) or PID (Erlang) of an actor, you can message it via mailboxes.
powerful fault tolerance by organizing actors into a supervision hierarchy, and you can handle failures at its exact level of hierarchy.