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:読んでる間は書いちゃダメ)