RubyでSingletonパターン考察2・マルチスレッド対応

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

前回、RubyでSingletonパターン考察1 - Ruby入門勉強ルームで、if 条件判定によるSingletonパターンを書いてみましたが、これはマルチスレッドの場合に複数インスタンスが生成されてしまう問題がありました。


Singletonパターンをマルチスレッド対応

RubyでSingletonパターンを、マルチスレッドにも対応させてみます。
Javaの書き方の定石である、スタティック変数(Rubyでいうクラス変数)にSingletonとなるインスタンス変数を保持します。
newメソッドをprivateにして、外部から直接newさせないようにするのは、前回と同じです。

class Singleton2
  @@singleton = new
 
  # new をprivateにする
  private_class_method(:new)
 
  def self.singleton
    return @@singleton
  end
end
 
puts "--- マルチスレッドの場合 ---"
threads = []
for i in 1..3
  t = Thread.new do
    obj =  Singleton2.singleton
    puts "#{obj.object_id}\n"
  end
  threads << t
end
threads.each do |th|
  th.join
end

実行結果。

--- マルチスレッドの場合 ---
21102470
21102470
21102470

今度の場合、別のスレッドに切り替わることで、複数インスタンスが生成されるような問題箇所はありません。
こっちのほうが、書くのも簡単だと思います。


PHPの場合

実は、Rubyで書く前に、PHPで実験していたのですが、PHPの場合、同じような以下のコードが動きません。(バージョン PHP5.2.5)

<?php
class Singleton {
    private static $singleton = new Singleton();
    private function __construct() {
    }
    public static function getInstance() {
        return self::$singleton;
    }
}
$single = Singleton::getInstance();
var_dump($single);
?>

http://codepad.org/2luFyufKでの実行結果。

Parse error: syntax error, unexpected T_NEW on line 3

「private static $singleton = new Singleton();」の行を、「private static $singleton = "hoge";」とただの文字列にしてやると・・・

string(4) "hoge"

と実行結果が返ってきたことから、PHPの場合、クラス内のstatic変数への代入は文字列ならOKらしいが、クラス内のstatic変数(Rubyでいうクラス変数)では、newできないのでしょうか?
ということで、PHPでのマルチスレッド対応なSingletonパターンは、どうやって作成するのか分からないままです。


日時: 2009年08月18日 22:45

コメント (2)

このエントリーは実装することに意味があるのだと思いますが、RubyでSingletonでやる場合はModuleを使うのが一般的ですので紹介しておきます。

http://www.ruby-lang.org/ja/man/html/singleton.html

投稿者: 匿名 | 日時: 2009年08月27日 20:09

匿名さん、ありがとうございました。
Singleton用のライブラリがあるのですね。
observableやObserver パターンのModuleもありましたので、試してみようと思います。

投稿者: TAKA | 日時: 2009年08月28日 15:53



コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/493

この記事にトラックバックされる方は、参照先が分かるようにするために、「RubyでSingletonパターン考察2・マルチスレッド対応」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム