def test_threaded_refs threads = [] inc = Proc.new {|v| v + 1 } 4.times do |i| threads << Thread.new do Ref.dosync do @ref.alter(inc) end end end threads.each { |t| t.join } assert_equal 5, @ref.deref end # Produces # test_threaded_refs(TestRef): # NativeException: clojure.lang.LockingTransaction$RetryEx: null # clojure/lang/LockingTransaction.java:105:in `<init>' # clojure/lang/LockingTransaction.java:226:in `runInTransaction' # /home/phil/src/clojure-gem/lib/clojure/ref.rb:15:in `alter' # ./test/test_ref.rb:45:in `test_threaded_refs' # /home/phil/src/clojure-gem/lib/clojure/ref.rb:31:in `call' # /home/phil/src/clojure-gem/lib/clojure/ref.rb:31:in `dosync' # ./test/test_ref.rb:44:in `test_threaded_refs' # ./test/test_ref.rb:43:in `initialize' # ./test/test_ref.rb:43:in `new' # ./test/test_ref.rb:43:in `test_threaded_refs' # ./test/test_ref.rb:42:in `times' # ./test/test_ref.rb:42:in `test_threaded_refs'