Блокировка (или синхронизация) необходима только в том случае, когда несколько потоков изменяют часть изменяемого состояния.
Макрос locking
- это низкоуровневая функция, которую почти никогда не требуется использовать в Clojure. В некотором смысле это похоже на синхронизированный блок в Java.
В clojure обычно просто используют atom
для этой цели. В редких случаях требуется agent
, ref
. В еще более редких ситуациях вы можете использовать динамический c Var для получения изменяемого локального для потока состояния.
Внутренне Clojure atom
делегирует все валютные операции классу java.util.concurrent.atomic.AtomicReference
.
Ваш фрагмент кода показывает неправильное понимание цели и действия атома. Два параллельных потока могут обрабатывать ваш код атома одновременно, поэтому попытка не обеспечивает безопасность потока и приведет к ошибкам и повреждению данных.
Если вы действительно хотите изучить примитивы (т. Е. Java 1.2) примитивы синхронизации, см .: