Aren't alter and dosync just using LockingTransactions, which use the Java locking stuff under the hood? On Fri, May 18, 2012 at 9:28 AM, Warren Lynn <wrn.l...@gmail.com> wrote:
> > But I thought for a ref, all the "checking if an another thread has > changed the value behind my back" facility/logic is already there > (otherwise how can "dosync" and "alter" work, right?). So why not > using that? > > I did send the question to Rich but not sure he will have time to > attend this. I am still learning Clojure and so far like it > (especially compared to the bad experience with Common Lisp), but my > perfectionist side pokes me sometimes. > > On May 17, 6:42 pm, DAemon <forsakendae...@gmail.com> wrote: > > The reason that comes to mind most easily for me is that of deciding > which > > notion of equality to use for 'the value of Ref hasn't changed'. > > > > Also, short of keeping a counter on the Ref of the number of times it's > > been changed, and comparing on that, there's no other way to tell that no > > other thread has changed the Ref, as far as I know. Although I could be > > wrong, *throws question to the Gods of clojure* > > > > > > > > > > > > > > > > On Fri, May 18, 2012 at 8:03 AM, Warren Lynn <wrn.l...@gmail.com> > wrote: > > > Thanks and these are certainly workable solutions. But is there any > > > particular reason why with commute the update function is ALWAYS > > > called twice, even when no other thread changed the ref value at the > > > commit time? That is what bothers me. > > > > > On May 17, 5:46 pm, DAemon <forsakendae...@gmail.com> wrote: > > > > Would some of this difficulty be ameliorated by calling memoize on > the > > > > function that you use? That way, if it's an expensive function, and > the > > > > value hasn't changed, it's just looked up rather than recalculated. > > > > > > - DAemon > > > > > > On Fri, May 18, 2012 at 6:28 AM, Stuart Sierra > > > > <the.stuart.sie...@gmail.com>wrote: > > > > > > > I think the point with `commute` is to allow for more concurrency > at > > > the > > > > > expense of more computation. > > > > > > > If you want assurance that your function is only called once, you > can > > > use > > > > > `alter`. > > > > > > > Keep in mind that *any* code in a Ref transaction has the > potential to > > > be > > > > > called more than once if there's a conflict. > > > > > > > All this doesn't mean that it's impossible to avoid the duplicate > > > > > computation on `commute`. The code to study would be here: > > > > > > > > https://github.com/clojure/clojure/blob/8fda34e4c77cac079b711da59d5fe. > > > .. > > > > > > > -S > > > > > > > -- > > > > > 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 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 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 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