たかたです

ごめんなさい。間違えました。

> ですから、Javaと同じようにsynchronizeするためには、synchronizeする
> ブロックごとにロックされているかどうかの状態が定義されていなくては
> いけませんからそれぞれのブロックごとにMutexオブジェクトが必要だと思
い
> ます。

ごめんなさい。この説明では、正しくないですね。
別に、Mutexが複数なくても、

require 'thread'
m = Mutex.new
print "unlocked\n"
m.synchronize{
  print "locked\n"
}

print "unlocked\n"

m.synchronize{
  print "locked\n"
}

みたいなのも、ありです。ですから、先ほどのメール(ruby-list:19685)で
Rubyでは、Javaと違って、Mutexオブジェクトがブロックがロックされている
か
どうかの情報を格納しているのは正しいんですが、同じMutexオブジェクトで
も
同時にlockしようとしなければ、期待通り動くはずです。
越水さんのもとのコードがまずいのは、lockされている状態のMutexをさらに
lockしようとしていることだけですから。

たかたひであき