土岐です。

Date: Sun, 19 Dec 1999 17:58:04 +0900
Subject: [ruby-list:19677] Mutex#synchronize
Tomoyuki Kosimizu <greentea / fa2.so-net.ne.jp> wrote...

越水さん> 下のコードを実行すると:
...(略)...
越水さん> と叱られてしまいます。こうした問題をうまく解決するにはどうしたらいいで
越水さん> しょうか?

手間が増えますが、こういうコードではだめでしょうか?

require 'thread'

class Foo
  def initialize
    @lock = Mutex.new
  end

  def _meth_out
    _meth_in
  end
  private: _meth_out

  def _meth_in
    p true
  end
  private: _meth_in
  
  def meth_out
    @lock.synchronize {
      _meth_out
    }
  end
  
  def meth_in
    @lock.synchronize {
      _meth_in
    }
  end
end

Date: Sun, 19 Dec 1999 20:24:29 +0900
Subject: [ruby-list:19681] Re: Mutex#synchronize
Tomoyuki Kosimizu <greentea / fa2.so-net.ne.jp> wrote...

越水さん> Javaの話で恐縮ですが、Javaで書くと次のようになります:

越水さん> class Foo {
越水さん>   public static void main(String[] args) {
越水さん>     new Foo().meth_out();
越水さん>   }

越水さん>   synchronized void meth_out() {
越水さん>     meth_in();
越水さん>   }

越水さん>   synchronized void meth_in() {
越水さん>     System.out.println(true);
越水さん>   }
越水さん> }

越水さん> [ruby-list:19677]のコードは、このJavaの書き方を真似たものです。

たぶん Java は同じクラスのメソッドから呼ばれているときは自動的に
判別して、ロックを重ねて掛けないようにしているのではないかと
思います。
# 本当かなあ? Java は使ってみたことがあるという程度なので
# ちょっと自信が無いです。

--------------------------------------------------
土岐 仁謙    神戸大学物理高エネ研 M2
http://www.freedom.ne.jp/toki/