Functional programming. Clojure's immutable, persistent data structures encourage side-effect free programming that can easily scales across multiple processor cores.
* Software Transactional Memory (STM). STM provides a mechanism for managing references and updates across threads.
* Agents. Agents provide a thread-safe mechanism for asynchronous, uncoordinated updates.
* Atoms. Atoms provide for synchronous, uncoordinated updates.
* Dynamic Vars. Dynamic Vars support thread-local state.