Ответ 1

Невозможно. Просто заверните вызов метода в мьютекс.

Создайте новые Mutex внутри класса, чтобы вы могли использовать один и тот же мьютекс:

class Foo
  attr_reader :my_val

  def initialize
    @my_mutex = Mutex.new
    @my_val = 0
  end

  def bar
    @my_mutex.synchronize do
      # do something you want to be synchronized here, e.g.:
      @my_val = @my_val + 1
    end
  end

  def another_bar
    @my_mutex.synchronize do
      # do something you want to be synchronized here
      @my_val = @my_val - 1
    end
  end
end

foo = Foo.new
threads = []
threads << Thread.new { 50.times { foo.bar }}
threads << Thread.new { 50.times { foo.another_bar }}
threads.map { |t| t.join } # wait for all threads to finish
puts foo.my_val # should print 0

См. http://apidock.com/ruby/Mutex

Возможно, вы также можете сделать магию метапрограммирования, чтобы защищать только ваши методы. Обертывание методов для вас, например. создавая новый модифицированный метод "bar" и "another_bar" с этим блоком синхронизации внутри него.