In this chapter, we looked at how Clojure approaches concurrency and parallelism. First, you learned about the differences between concurrency and parallelism. Then, we looked at the state, identity, and values in programming languages. This allowed us to investigate how the data and states are managed in concurrent programs in Java.
Finally, having seen how difficult concurrency is, we moved on to the Clojure approach to concurrency. We looked at how (and when) to use agents, atoms, refs, and vars. We finished the chapter by looking at futures and promises in Clojure.
Contrary to many object-oriented languages, Clojure provides clear distinctions between states and identities. Along with some tools, this allows developers to write and maintain concurrent programs in an easier way.
This brings us to the end of what was hopefully an enjoyable and informative journey through...