아토믹을 사용하면 틀림없이 라인이 안전합니까?

3172 단어
- (void)setProp:(NSString *)newValue {    [_prop lock];    _prop = newValue;    [_prop unlock];}내 이해로: 1.이곳의 라인 안전은 Getter,setter에 의해 결정됩니다.예를 들어 @property(nonatomic,copy) NSString*str의 경우self를 호출합니다.str = @"HELLO,GUY";만약 다중 스레드라면, 한 스레드가setter 방법을 실행할 때 문자열 복사와 관련이 있고, 다른 스레드가 읽으면, 절반의 데이터, 즉 가베이지 데이터를 읽을 수 있다.2. 또한 Getter,setter의 라인만 안전합니다.예를 들어 @property(atomic,strong) NSMutable Array *arr;만약 한 라인이 데이터를 순환해서 읽는다면, 한 라인이 데이터를 순환해서 쓰면 틀림없이 메모리 문제가 발생할 것이다.이것은 setter, Getter와 관계가 없기 때문이다.
그 다음에 아토믹은 set 방법에 자물쇠를 넣어 여러 라인이 이property를 계속 쓰는 것을 방지하여 예측하기 어려운 수치를 만들었다.이것도 읽기와 쓰기의 잠금일 뿐이다.라인이 안전한 것과는 사실 좀 다르다.아래 봐.
 @interface MONPerson : NSObject 
@property (copy) NSString * firstName; 
@property (copy) NSString * lastName; 
- (NSString *)fullName; 
@end

Thread A:
p.firstName = @"Rob";
Thread B:
p.firstName = @"Robert";
Thread A:
label.string = p.firstName; // << uh, oh -- will be Robert

그러나 C도 쓰고 D가 읽으면 D는 무작위 값(ABC가 수정한 값)을 읽는다. 이것은 라인이 안전한 것이 아니다.가장 좋은 방법은lock을 사용하는 것이다.
Thread A:
[p lock]; // << wait for it… … … …
// Thread B now cannot access 
pp.firstName = @"Rob";
NSString fullName = p.fullName;
[p unlock];
// Thread B can now access plabel.string = fullName;

Thread B:
[p lock]; // << wait for it… … … …
// Thread A now cannot access p…
[p unlock];

아토믹의 가장 큰 문제는 느린 것이다. 노토믹보다 20배 느리다.물론 마지막으로 이런 수치 변화는 서버가 할 수 있도록 권장합니다.

좋은 웹페이지 즐겨찾기