Hi,
the commute case can be understood:
user=> (send thread (fn [agt aref] (dosync (commute aref + 100)
(Thread/sleep 8000) agt)) account)
#<Agent@1950e0a: "Thread">
user=> (time (dosync (ref-set account 2000)))
"Elapsed time: 0.369415 msecs"
2000
user=> @account
2000
;; wait a few seconds
user=> @account
2100
So, the transaction run from the agent just recalculates the values at the
end of the transaction again, based upon the value the ref has then.
See LockingTransaction.java:290:
vals.put(ref, f.fn.applyTo(RT.cons(vals.get(ref), f.args)));
So in this case the ref-set from the REPL thread comes first.
As for the other effect, that the REPL thread blocks until the eight seconds
from the agent-transaction are finished, we can clearly see that the ref-set
call is the last comitter, because the ref has the value 2000 afterwards:
user=> (dosync (ref-set account 1000))
1000
user=> (send thread (fn [agt aref] (dosync (alter aref + 100) (Thread/sleep
8000) agt)) account)
#<Agent@1950e0a: "Thread">
user=> (time (dosync (ref-set account 2000)))
"Elapsed time: 5241.963286 msecs"
2000
;; again wait a few seconds for good measure
user=> @account
2000
I have to confess, that I don't understand that, yet. I was first guessing
it could be related to the history, but the history is still zero:
user=> (.getHistoryCount account)
0
Unless someone else answers this I will try to find some time to dive into
it this evening (CEST). Adding a few atoms as counters here and there
usually helps understanding, what is going on under the hooks.
Regards,
Stefan
PS: Starting a thread with a transaction using future seems easier to me,
e.g.:
(future (dosync (alter account + 100) (Thread/sleep 8000)))
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en