Hola chicos: La documentación para el clojure "átomo" establece que -Las condiciones de carrera y átomos clojure
"Changes to atoms are always free of race conditions."
Sin embargo- una condición de carrera se define no sólo en términos de un cambio, sino más bien, en el contexto de operaciones lógicas paralelas en diferentes hilos.
Me pregunto: ¿cuál es el significado de la garantía de que "Los cambios en los átomos están siempre libres de condiciones de carrera"? En java, tenemos primitivas atómicas que admiten ciertas operaciones seguras de subprocesos que son específicas (por ejemplo, AtomicInteger admite una operación "getAndIncrement"). Pero los átomos Clojure son de tipo-agnóstico, por ejemplo, podemos invocar:
(atom "Hi im a string") Or
(atom (.getClass Object))
La flexibilidad del método átomo significa que Clojure, bajo el capó, no es "inteligente" proveer-tipo específico atómica/thread-safe operaciones para átomos.
Por lo tanto, me pregunto - ¿qué es exactamente el método átomo de "hacer" a nuestros objetos
* "Se garantiza que estas funciones se ejecutarán secuencialmente" * - esto no es exactamente lo que garantiza el 'átomo '. La garantía real es que 'swap af' recuerda el valor de' a', lo pasa a 'f' y si el valor de' a' después de 'f' está terminado sigue siendo igual al valor anterior, luego se reemplaza por el resultado de 'f'. Muchas otras funciones se podrían haber aplicado a 'a' mientras tanto, siempre que sus efectos se anulen mutuamente. –
@Rafal - gracias buen lugar, he actualizado la respuesta para ser un poco más preciso. – mikera
@myself: la comparación subyacente es en realidad Java == (identidad del objeto), así que en lugar de "igual" debería haber escrito "idéntico" y en lugar de "cancelar el uno al otro" -> "dejar el átomo haciendo referencia al mismo objeto" . –