snipplrCallback({"id":28547,"title":"clojure-stm-in-jruby","source":"
require<\/span> "java"<\/span><\/div><\/li> require<\/span> "clojure.jar"<\/span><\/div><\/li> include_class "clojure.lang.LockingTransaction"<\/span><\/div><\/li> include_class "clojure.lang.Ref"<\/span><\/div><\/li> <\/div><\/li> my_account = Ref.new<\/span>(<\/span>1<\/span>)<\/span><\/div><\/li> <\/div><\/li> puts<\/span> "Initial value #{my_account.deref}"<\/span><\/div><\/li> <\/div><\/li> begin<\/span><\/div><\/li> my_account.set<\/span>(<\/span>1000<\/span>)<\/span><\/div><\/li> rescue<\/span> java.lang<\/span>.IllegalStateException<\/span><\/div><\/li> puts<\/span> "Reference updated outside a transaction.. Naughty.. :)"<\/span><\/div><\/li> end<\/span><\/div><\/li> <\/div><\/li> puts<\/span> "Value after failed update #{my_account.deref}"<\/span><\/div><\/li> <\/div><\/li> Thread<\/span>.new<\/span> {<\/span>LockingTransaction.run_in_transaction<\/span>(<\/span>Proc<\/span>.new<\/span> {<\/span> my_account.set<\/span> 1000<\/span> }<\/span>)<\/span>}<\/span><\/div><\/li> <\/div><\/li> Thread<\/span>.new<\/span> {<\/span>LockingTransaction.run_in_transaction<\/span>(<\/span>Proc<\/span>.new<\/span> {<\/span> sleep<\/span> 0.1<\/span>; my_account.set<\/span> 21000<\/span> }<\/span>)<\/span>}<\/span> # Will fail because get commited after first transaction <\/span><\/div><\/li> <\/div><\/li> puts<\/span> "Value after successful transaction #{my_account.deref}"<\/span><\/div><\/li><\/ol><\/pre>","link":"https:\/\/snipplr.com\/view\/28547\/clojure-stm-in-jruby"});