From: Charles Oliver Nutter Date: 2011-06-04T01:51:18+09:00 Subject: Re: jruby --1.9 : 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?" 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 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 > >