snipplrCallback({"id":28547,"title":"clojure-stm-in-jruby","source":"
  1. require<\/span> "java"<\/span><\/div><\/li>
  2. require<\/span> "clojure.jar"<\/span><\/div><\/li>
  3. include_class "clojure.lang.LockingTransaction"<\/span><\/div><\/li>
  4. include_class "clojure.lang.Ref"<\/span><\/div><\/li>
  5.  <\/div><\/li>
  6. my_account = Ref.new<\/span>(<\/span>1<\/span>)<\/span><\/div><\/li>
  7.  <\/div><\/li>
  8. puts<\/span> "Initial value #{my_account.deref}"<\/span><\/div><\/li>
  9.  <\/div><\/li>
  10. begin<\/span><\/div><\/li>
  11. my_account.set<\/span>(<\/span>1000<\/span>)<\/span><\/div><\/li>
  12. rescue<\/span> java.lang<\/span>.IllegalStateException<\/span><\/div><\/li>
  13. puts<\/span> "Reference updated outside a transaction.. Naughty.. :)"<\/span><\/div><\/li>
  14. end<\/span><\/div><\/li>
  15.  <\/div><\/li>
  16. puts<\/span> "Value after failed update #{my_account.deref}"<\/span><\/div><\/li>
  17.  <\/div><\/li>
  18. 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>
  19.  <\/div><\/li>
  20. 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>
  21.  <\/div><\/li>
  22. puts<\/span> "Value after successful transaction #{my_account.deref}"<\/span><\/div><\/li><\/ol><\/pre>","link":"https:\/\/snipplr.com\/view\/28547\/clojure-stm-in-jruby"});