概要
Mutex#synchronize { ... } -> object
詳細
mutex をロックし、ブロックを実行する。
実行後に必ず mutex のロックを解放する。
サンプルコード
require "thread" require "date" class MutexSample attr_reader :count def initialize @m = Mutex.new end def synchronize_test(id) puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}" @m.synchronize { puts "id = #{id}, inner synchronized block #{DateTime.now}" sleep(rand(3)) } puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}" end end ms = MutexSample.new threads = [*1..5].map do |i| Thread.new do |t| ms.synchronize_test(i) end end threads.each(&:join)
出力
$ ruby mutex_synchronize.rb id = 1, locked? = false 2014-08-27T22:40:45+09:00 id = 3, locked? = false 2014-08-27T22:40:45+09:00 id = 5, locked? = false 2014-08-27T22:40:45+09:00 id = 1, inner synchronized block 2014-08-27T22:40:45+09:00 id = 2, locked? = false 2014-08-27T22:40:45+09:00 id = 1, locked? = false 2014-08-27T22:40:45+09:00 id = 4, locked? = false 2014-08-27T22:40:45+09:00 id = 3, inner synchronized block 2014-08-27T22:40:45+09:00 id = 3, locked? = false 2014-08-27T22:40:45+09:00 id = 5, inner synchronized block 2014-08-27T22:40:45+09:00 id = 5, locked? = true 2014-08-27T22:40:47+09:00 id = 2, inner synchronized block 2014-08-27T22:40:47+09:00 id = 2, locked? = false 2014-08-27T22:40:49+09:00 id = 4, inner synchronized block 2014-08-27T22:40:49+09:00 id = 4, locked? = false 2014-08-27T22:40:50+09:00