One of Clojure's most interesting features is software transactional memory (STM). It uses multiversion concurrency control (MVCC), in a very similar fashion to how databases work, implementing a form of optimistic concurrency control.
Note
MVCC is what databases use for transactions; what this means is that every operation within a transaction has its own copy of variables. After executing its operations, it checks if any of the used variables changed during the transaction and if they did the transaction fails. This is called optimistic concurrency control because we are optimistic and we don't lock any variable; we let every thread do its work thinking that it's going to work correctly and then check if it was correct. In practice, this allows for greater concurrency.
Let's start with the most obvious example, a bank account.
Let's write some code now, enter into the REPL and write:
(def account (ref 20000)) (dosync (ref-set account 10)) (deref account...