В Java мы можем сделать метод "синхронизированным", просто используя ключевое слово "synchronized" в определении функции.
Как мы это делаем в Ruby?
Ответ 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
Возможно, вы также можете сделать магию метапрограммирования, чтобы защищать только ваши методы. Обертывание методов для вас, например. создавая новый модифицированный метод "bar" и "another_bar" с этим блоком синхронизации внутри него.