After talking with MenTaLguY on IRC about adding some concurrent
collections to JRuby, we came up with a new feature for people to try
out:
require ‘jruby/synchronized’
class MyClass
include JRuby::Synchronized
…
or
obj.extend JRuby::Synchronized
the effect of including or extending this new module is that all
method calls against that class’s object (or against that
now-singleton object) will act like they’re wrapped in a Java
synchronized block. No two threads will be able to execute methods
against those objects at the same time (on a per-object basis,
obviously).
This is definitely blunt tool for threadsafety, and using it
willy-nilly can easily lead to deadlocks (like if you have two
interdependent data structures that are both Synchronized and call
each other). But used appropriately, it provides a pretty simple
(brute-force) way to make a given object or class thread-safe®.
Getting a synchronized collection is now as simple as
foo = {}
foo.extend JRuby::Synchronized
Or perhaps better:
class SyncHash < Hash
include JRuby::Synchronized
end
Keep in mind that all methods are synchronized, including reads and
methods unrelated to the internal state of the object. In general, the
JVM does a good job of making locks cheap, so I think this is wholly
acceptable for the utility you get.
Comments, suggestions, questions welcome.
- Charlie
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email