I like left-right concurrency control because it sidesteps a number of thread safety problems by ensuring that a thread can always safely read or write to its own buffer.
Fair warning, STM has largely not panned out in industry, and is no longer in common use. Clojure was built when it was still fashionable, but even having the advantage of immutable-by-default data structures, 99% of modern Clojure doesn't use complicated STM, and instead relies on the humble atom, which is updated with a glorified CAS.