2016-06-16 4 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

Смежные вопросы