Verwenden der Klasseninstanzvariablen für Mutex in Ruby

Hinweis: Die unten gezeigte Code-Zusammenfassung istnicht eine destillation des codes mit dem ich das problem hatte. Ich habe diese ursprüngliche Zusammenfassung hier gelassen, da bereits jemand anders geantwortet hat, aber dertatsächlich Code wird in der Antwort gezeigt, die ich unten zur Verfügung gestellt habe.

Ich konnte dies nicht auf einen kleinen fehlgeschlagenen Testfall eingrenzen, erhalte jedoch einen Fehler mit dem folgenden allgemeinen Konstrukt:

class Foo

  @mutex = Mutex.new

  ....

  def self.bar
    @mutex.synchronize { ... }
  end

end

Wenn ich mehrere Threads aufrufeFoo.bar, manchmal@mutex werde auswerten zunil imbar. Wenn ich anstelle einer Instanzvariablen eine Konstante (z. B. MUTEX) verwende, habe ich dieses Problem nicht.

Ich weiß nicht, ob es von Bedeutung ist, aber ich verwende JRuby auf einem Multi-Core-Rechner.

Ich würde mich über jede Erklärung oder Hilfe bei der Eingrenzung des Problems freuen.

Update: Ich glaube, das hängt mit dem automatischen Laden zusammen. Mit Rails konnte ich ein ähnliches Problem mit folgendem Inhalt reproduzierenfoo.rb in einem der Verzeichnisse Rails autoloads von:

class Foo
  @mutex = Mutex.new
  def self.bar
    @mutex.synchronize {}
  end
end

Wenn ich dann folgendes in der Rails-Konsole ausführe:

1.upto(4).map { Thread.new { Foo.bar }}.map(&:join)

Ich erhalte folgenden Fehler:

RuntimeError: Circular dependency detected while autoloading constant Foo
    from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:461:in `load_missing_constant'
    from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:184:in `const_missing'
    from (irb):1:in `evaluate'

und dieses Verhalten ist dasselbe in CRuby (MRI Ruby).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage