2016-06-16 32 views

回答

3

通常,僅使參考成爲線程安全的只讀是不夠的。你需要確保被引用的對象不能被突變。

您的功能是線程安全的。但是,使myString只讀只是原因的一部分:另一部分是myString是不可變類型的事實。

例如,這MyClass不是線程安全的,儘管myData被只讀:

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