That's wacked. Please file a bug at http://bugs.jruby.org. Looks like
a class name we're generating internally is not getting handled
properly.

On Wed, May 25, 2011 at 4:34 PM, Markus Fischer <markus / fischer.name> wrote:
> Hi,
>
> the following script works under MRI 1.9, but not under jruby 1.9 (but
> in jruby 1.8):
>
> require 'thread'
>
> class MutexedBoolean
>  def initialize(initial_value)
>    @value = initial_value
>    @mutex = Mutex.new
>  end
>  def true?
>    @mutex.synchronize do
>      @value == true
>    end
>  end
> end
>
> threads = []
>
> run = MutexedBoolean.new(true)
>
> Thread.abort_on_exception = true
>
> threads << Thread.new do
>  while run.true?
>    puts "1"
>    sleep 1
>  end
> end
>
> threads << Thread.new do
>  while run.true?
>    puts "2"
>    sleep 1
>  end
> end
>
> threads.each { |t| t.join }
>
>
> Here's the stacktrace I'm getting. Only the first thread runs:
>
> Exception in thread "RubyThread-1: threadtest.rb:1"
> java.lang.LinkageError: loader (instance of
> org/jruby/util/JRubyClassLoader): attempted duplicate class definition
> for name: "threadtest$block_0$RUBY$true?"
>    at java.lang.ClassLoader.defineClass1(Native Method)
>    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
>    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
>    at
> org.jruby.util.JRubyClassLoader.defineClass(JRubyClassLoader.java:76)
>    at
> org.jruby.internal.runtime.methods.InvocationMethodFactory.endClassWithBytes(InvocationMethodFactory.java:1358)
>    at
> org.jruby.internal.runtime.methods.InvocationMethodFactory.getBlockCallback19(InvocationMethodFactory.java:899)
>    at
> org.jruby.javasupport.util.RuntimeHelpers.createBlockCallback19(RuntimeHelpers.java:177)
>    at
> org.jruby.javasupport.util.RuntimeHelpers.createCompiledBlockBody19(RuntimeHelpers.java:292)
>    at
> org.jruby.javasupport.util.RuntimeHelpers.createCompiledBlockBody19(RuntimeHelpers.java:282)
>    at
> org.jruby.ast.executable.RuntimeCache.createBlockBody19(RuntimeCache.java:442)
>    at
> org.jruby.ast.executable.RuntimeCache.getBlockBody19(RuntimeCache.java:85)
>    at
> org.jruby.ast.executable.AbstractScript.getBlockBody190(AbstractScript.java:106)
>    at threadtest.method__2$RUBY$true_p_(threadtest.rb:9)
>    at
> threadtest$method__2$RUBY$true_p_.call(threadtest$method__2$RUBY$true_p_:65535)
>    at
> threadtest$method__2$RUBY$true_p_.call(threadtest$method__2$RUBY$true_p_:65535)
>    at
> org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:262)
>    at
> org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:105)
>    at threadtest.block_2$RUBY$__file__(threadtest.rb:31)
>    at
> threadtest$block_2$RUBY$__file__.call(threadtest$block_2$RUBY$__file__:65535)
>    at org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:154)
>    at org.jruby.runtime.CompiledBlock19.call(CompiledBlock19.java:82)
>    at org.jruby.runtime.Block.call(Block.java:89)
>    at org.jruby.RubyProc.call(RubyProc.java:268)
>    at org.jruby.RubyProc.call(RubyProc.java:232)
>    at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:95)
>    at java.lang.Thread.run(Thread.java:662)
>
> If I remove the @mutex check in true?, it works in jruby 1.9.
>
> thanks,
> - Markus
>
>