2016-06-16 7 views

答えて

3

一般に、クラスをスレッドセーフにするには、読み取り専用の参照を作成するだけでは不十分です。参照先のオブジェクトを変更できないようにする必要があります。

あなたの機能はスレッドセーフです。ただし、myStringを読み取り専用にすることは、理由の一部にすぎません。もう1つは、myStringが不変型であるという事実です。例えば

、このMyClassmyDataが読み取り専用されているにもかかわらず、スレッドセーフではありません。

class MyClass 
    let myData = Mutable() 

    func myFunc() -> Mutable { 
     return self.myData 
    } 
} 

class Mutable { 
    var array : [String] 
    func add(s:String) { 
     array.apppend(s) 
    } 
} 
+0

'Mutable'は何の機能を持っていないと' array'は変更しないことが保証されている場合は? 'myFunc'はスレッドセーフであろうか? – Code

+0

@ tumber033 'myData'に関数がなく、データが変更されない場合は、実質的に不変であり、' myFunc'をスレッドセーフにします。さらに、 'myData'のすべての変更可能な関数を非公開にすると、' MyClass'はモジュール外でスレッドセーフになりますが、変更可能な関数にアクセスできるモジュール内でスレッドセーフではない可能性があります。 – dasblinkenlight

関連する問題