I try my code on my machine.

1. deref version
(defn funk [r]
        (dosync
              (println "Start:" @r)
              (Thread/sleep 10000)
              (println "End:" @r)))

user> (.start (Thread. #(funk r)))
Start: 1
nil

user> (dosync (ref-set r 5))
Start: 5
End: 5
5

Actually, when I type in (dosync (ref-set r 5)), I got 5 soon. After a
few seconds, it prints out the "Start: 5". And after another few
seconds, print out " End: 5". So yes, the funk transcation is redone.

2. Ensure version
 (defn funk [r]
        (dosync
              (println "Start:" (ensure r))
              (Thread/sleep 10000)
              (println "End:" (ensure r))))

user> (.start (Thread. #(funk r)))
Start: 1
nil

user>user> (dosync (ref-set r 5))
End: 1
5

When I type in the (dosync (ref-set r 5)), that transcation was
blocked. So it is run after the funk finished.

So I can guess that, If you use deref, there can be multipule
transcation running at once. But sometimes transcation must be rerun.
If you use ensure, only one transcation is run. Others are blocked.
Is it true?

Thanks for all your help!
Sincerely,
 Jack


On 2月21日, 下午10时26分, Michał Marczyk <michal.marc...@gmail.com> wrote:
> On 21 February 2010 14:13, Michael Wood <esiot...@gmail.com> wrote:
>
> > That does demonstrate the difference (or a difference), but I don't
> > get 3 printlns.
>
> Ouch, I actually posted the wrong version of the function. Here's an
> improvement in the context of a REPL interaction:
>
> 1. ensure version:
>
> user> (defn funk [r]
>         (dosync
>          (println (ensure r))
>          (Thread/sleep 5000)
>          (println (ensure r))))
> #'user/funk
> user> (def r (ref 1))
> #'user/r
> user> (.start (Thread. #(funk r)))
> 1
> nil
> user> (dosync (ref-set r 5))
> 1
> 5
>
> 2. deref version:
>
> user> (defn funk [r]
>         (dosync
>          (println @r)
>          (Thread/sleep 5000)
>          (println @r)))
> #'user/funk
> user> (def r (ref 1))
> #'user/r
> user> (.start (Thread. #(funk r)))
> 1
> nil
> user> (dosync (ref-set r 5))
> 5
> 5
> 5
>
> Note how the deref version prints more lines (because it retries the
> transaction).
>
> I'm using a newer commit (49a7d6b8e14050a45df5332e768ba6647752215d),
> but this shouldn't make any difference.
>
> Sincerely,
> Michał

-- 
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

Reply via email to