В чем разница между блокировкой и атомом / сбросом! / Обменом! в Clojure - PullRequest
0 голосов
/ 27 марта 2020

Я читал некоторый исходный код и столкнулся с использованием locking в Clojure. Это заставило меня задуматься об атомной версии. Так в чем же разница между двумя фрагментами кода, я думаю, что они делают то же самое?

(def lock (Object.))

(locking lock
  ...some operation)
(def state (atom true))

(when @state
  (reset! state false)
  ...some operation
  (reset! state true))

1 Ответ

5 голосов
/ 27 марта 2020

Блокировка (или синхронизация) необходима только в том случае, когда несколько потоков изменяют часть изменяемого состояния.

Макрос locking - это низкоуровневая функция, которую почти никогда не требуется использовать в Clojure. В некотором смысле это похоже на синхронизированный блок в Java.

В clojure обычно просто используют atom для этой цели. В редких случаях требуется agent, ref. В еще более редких ситуациях вы можете использовать динамический c Var для получения изменяемого локального для потока состояния.

Внутренне Clojure atom делегирует все валютные операции классу java.util.concurrent.atomic.AtomicReference.


Ваш фрагмент кода показывает неправильное понимание цели и действия атома. Два параллельных потока могут обрабатывать ваш код атома одновременно, поэтому попытка не обеспечивает безопасность потока и приведет к ошибкам и повреждению данных.


Если вы действительно хотите изучить примитивы (т. Е. Java 1.2) примитивы синхронизации, см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...