Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

マルチスレッドデザインパターン | Immutable

概要

Immutable

詳細

Immutableパターンクラスが不変であることを保証し、
マルチスレッドでの実行の際に同期する必要がなくなります。
具体的にはフィールドを初期化時に設定後、変更しないようにします。
書き込み用のアクセサやメソッドは提供しません。

この際、同期処理が不要になるためmutableなクラスに比べて高速になります。

サンプルコード

# encoding: utf-8
require "pp"
require "thread"

class Hoge
  attr_accessor :hoge,:hige
  def initialize(hoge, hige)
    self.hoge = hoge
    sleep 1
    self.hige = hige
  end
end

hoge = Hoge.new("hoge", "hige")
puts hoge.frozen?
hoge.freeze
puts hoge.frozen?

threads = []
5.times do
  threads << Thread.new do |t|
    # freezeしたので設定不可
    #hoge.hoge = "changed hoge"

    puts "#{hoge.hoge}:#{hoge.hige}"
  end
end

threads.each(&:join)

出力

false
true
hoge:hige
hoge:hige
hoge:hige
hoge:hige
hoge:hige