I was wondering the same thing, shintotomoe. This thread <https://groups.google.com/forum/#!topic/clojure/CjxK7xEsOKQ> talks about it as well. I think it's safe to assume that since `ArrayList` uses unsynchronized mutability internally (a quick review of the GrepCode entry for `ArrayList` confirms this <http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java>), then we can rest assured that a `volatile` box as opposed to a totally unsynchronized mutable variable is unnecessary, even in the context of `fold`. After all, `reduce` (and by extension, `transduce`) is only ever going to be single-threaded unless the data structure in question unexpectedly implements a multithreaded reduce, which should never happen (and if it does, you likely have bigger problems). To be honest, I'm not sure why `volatile` is used in transducers instead of e.g. an `unsynchronized-mutable` box. There may be a good reason, but I'm not seeing it immediately. I'd love to learn.
On Thursday, January 1, 2015 at 10:36:13 PM UTC-5, shintotomoe wrote: > > Thank you for the superfast response. I take it implementing your own > transducing process is not something you would usually do unless you have a > unique use case (my own use case being already implemented by chan taking a > transducer). > > Still, I was wondering about the use of ArrayList in partition-all, and > the recommendation to use volatiles inside transducers, which seem at odds. > It seems we don't need to implement transducers in a thread-safe way. Is > that correct? > > On Friday, January 2, 2015 12:58:51 PM UTC+11, tbc++ wrote: >> >> Core.async already has pipeline, pipeline-blocking and pipeline-async. In >> addition you can use a transducer inside a channel. Use those instead. >> >> Timothy >> >> On Thu, Jan 1, 2015 at 6:55 PM, shintotomoe <tste...@atlassian.com> >> wrote: >> >>> I was wondering how to apply a transducer inside a go process. What I've >>> so far is the following >>> >>> (defn pipe-xform [in-ch out-ch xform] >>> (let [tr >>> (let [tr (xform (fn >>> ([result] result) >>> ([result input] (conj! result input))))] >>> (fn >>> ([] (locking tr (persistent! (tr (transient []))))) >>> ([input] (locking tr (persistent! (tr (transient []) input >>> ))))))] >>> (go-loop [] >>> (if-some [value (<! in-ch)] >>> (do (doseq [v (tr value)] >>> (>! out-ch v)) >>> (recur)) >>> (do (doseq [v (tr)] >>> (>! out-ch v)) >>> (close! out-ch)))))) >>> >>> Now, I could just do >>> >>> (let [xf-ch (chan 1 xform)] >>> (pipe in-ch xf-ch) >>> (pipe xf-ch out-ch) >>> >>> >>> Or just redesign my code so that I can create in-ch or out-ch with the >>> transducer directly, but I was wondering whether there are any obvious >>> flaws with the pipe-xform implementation. >>> >>> In particular, I was wondering about the locking. At first I was under >>> the impression that transducers are thread-safe due to the use of >>> volatiles, but looking at the partition-all transducer, which uses an >>> ArrayList for its state, It appears that's not the case. >>> >>> Any feedback greatly appreciated. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@googlegroups.com >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+u...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> >> -- >> “One of the main causes of the fall of the Roman Empire was that–lacking >> zero–they had no way to indicate successful termination of their C >> programs.” >> (Robert Firth) >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.