Hi guys: Dokumentacja dla Clojure „atom” stwierdza, że -warunki wyścigu i Atomy Clojure
"Changes to atoms are always free of race conditions."
However- warunkiem rasa nie jest zdefiniowana tylko w kategoriach zmiany, ale raczej w kontekście równoległe operacje logiczne w różnych wątkach.
Zastanawiam się - jakie jest znaczenie gwarancji, że "Zmiany w atomach są zawsze wolne od warunków wyścigu"? W języku java mamy prymitywy atomowe, które obsługują określone wątkowe operacje, które są specyficzne (na przykład AtomicInteger obsługuje operację "getAndIncrement"). A atomy clojure są typu niezależnej od, na przykład, może to wywołać:
(atom "Hi im a string") Or
(atom (.getClass Object))
elastyczność sposobu atom oznacza Clojure pod maską nie jest „elegancko” dostarczanie typ specyficznych atomowy/wątku bezpieczny operacje dla atomów.
Zatem chciałbym zapytać - co dokładnie jest metoda atom „robi” do naszych obiektów
* "Gwarantujemy, że funkcje te będą wykonywane sekwencyjnie" * - nie jest to dokładnie to, co gwarantuje "atom". Rzeczywistą gwarancją jest, że 'swap af' zapamiętuje wartość' a', przekazuje ją do 'f' i jeśli wartość' a' po zakończeniu 'f' jest nadal równa starej wartości, to jest ona zastępowana przez wynik 'f'. W międzyczasie wiele innych funkcji można było zastosować do 'a', o ile ich efekty znoszą się nawzajem. –
@Rafal - dziękuję, poprawiłem odpowiedź, aby była nieco bardziej precyzyjna. – mikera
@myself: Podstawowym porównaniem jest w rzeczywistości Java == (tożsamość obiektu), więc zamiast "równy" powinienem napisać "identyczny" i zamiast "anulować się nawzajem" -> "zostaw atom odwołujący się do tego samego obiektu" . –