それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyでマルチスレッドその4 Immutable

Ruby結城浩せんせいのJavaマルチスレッド本をやってみる試み、その4

Immutable パターン

#/usr/bin/envy ruby
#Immutable
# 壊れない設計
class PrintPersonThread < Thread
  def initialize person
    @person = person
    block = Proc.new{
      while true do
        puts Thread.current.to_s + " prints #{@person.to_s}"
      end
    }
    super(&block)
  end
end
class Person
  attr_reader :name,:address
  def initialize name, address
    @name = name
    @address = address
  end
  def to_s
    "[ Person: name = " + self.name + ", address = " + self.address + " ]";
  end
end
person = Person.new("Alice","Arizona")
threads = (1..3).map{
  PrintPersonThread.new person
}
threads.each{|t| t.join}
puts "END"

読み込みに限定すれば壊れない。

ReadOnlyは安全だよ。ってこと

rubyだとattr_reader

クラス変数をattr_readerしてやればいい。だけど、Rubyはオープン・クラスなので、どこでどう変更されるか分からないで。attr_readerを指定した意図をコードに書く必要があると思う。マルチスレッドでの「安全」を考慮してる。と

コメント例
class Person
  attr_reader :name,:address #マルチスレッドで壊れないようにReadOnly

書き込みをしたいときは

  • Read-Writeの衝突
  • Write-Writeの衝突

に気をつける。これは次章以降で出てくる。(→ReadWrite-Lock:読んでる間は書いちゃダメ)