From: gotoken@... (GOTO Kentaro) Date: 1999-11-24T03:46:12+09:00 Subject: [ruby-list:18870] Re: Singleton の instance が複数になることがある --Multipart_Wed_Nov_24_03:45:40_1999-1 Content-Type: text/plain; charset=ISO-2022-JP ごとけんです In message "[ruby-list:18868] Singleton の instance が複数になることがある" on 99/11/24, Kazuhiro Nishiyama writes: >require 'singleton' > >class C > include Singleton > def initialize > Thread.pass # 実際には普通の処理をしているだけ。 > end >end > >Thread.new do > p C.instance.id >end >p C.instance.id ># 2つのinstanceのidが違う。 singleton.rb に以下のパッチを当てるというのはどうでしょう。 --Multipart_Wed_Nov_24_03:45:40_1999-1 Content-Type: application/octet-stream; type=patch Content-Disposition: attachment; filename="singleton.rb.patch" Content-Transfer-Encoding: 7bit --- singleton.rb-orig Fri Aug 13 23:28:39 1999 +++ singleton.rb Wed Nov 24 03:42:52 1999 @@ -11,13 +11,17 @@ # a = SomeSingletonClass.new # error (`new' is private) module Singleton + require "thread" def Singleton.append_features(klass) klass.private_class_method(:new) + klass.const_set("MUTEX", Mutex.new) klass.instance_eval %{ def instance - unless @__instance__ - @__instance__ = new - end + self::MUTEX.synchronize{ + unless @__instance__ + @__instance__ = new + end + } return @__instance__ end } --Multipart_Wed_Nov_24_03:45:40_1999-1--