rendered paste body#!/usr/bin/rubyrequire 'monitor'class ObjectWrapper def initialize(wrapped_object) @wrapped_object = wrapped_object end :private def method_missing(id, *args, &block) wrap(id, *args, &block) end def wrap_real(id, *args, &block) if block.nil? return @wrapped_object.__send__(id, *args) else return @wrapped_object.__send__(id, *args) { |*args2| block.call(*args2) } end end :public def wrap(id, *args, &block) wrap_real(id, *args, &block) endendclass Synchronizator < ObjectWrapper def initialize(wrapped_object) super @wrapped_object.extend(MonitorMixin) end def wrap(id, *args, &block) @wrapped_object.synchronize { wrap_real(id, *args, &block) } endendThread.abort_on_exception = truedef thr(list, number) list.each { |i| puts "#{number}: #{i}" sleep 0.02 }end list = [ 0, 1, 2, 3 ]puts "without synchronizator:"for i in 1..3 Thread.new { thr(list, i) }endsleep 1puts "\nwith synchronizator:"l_ = Synchronizator.new(list)for i in 1..3 Thread.new { thr(l_, i) }endsleep 1