atomicって何なのさ?(1)
atomic だけではインスタンスの整合性は保たれない?
@interface AClass : NSObject @property (copy) NSString *firstName; @property (copy) NSString *lastName; @end
こういうクラスがあるとします
で、現状
AClass *instanceA = [[AClass alloc] init]; instanceA.firstName = @"Brian"; instanceA.lastName = @"Kernighan";
となってるとします。
で、別々のスレッドで、一方は firstNameをDennisにlastNameをRitchieに変更し、もう一方で、firstName、lastNameそれぞれを取り出すとします。
タイミングによりますがこのような結果を得てしまう事があり得ます。
Thread A | Thread B |
instanceA.lastName=@"Ritchie" | |
firstName=instanceA.firstName | |
lastName=instanceA.lastName | |
instanceA.firstName=@"Dennis" |
上から下に時間経過
Thread Bで得られた値は
firstName | Brian |
lastName | Ritchie |
誰だよw
てな感じで、「スレッドセーフにするにはプロパティをatomicにしとけばそれでいいんだろ?」と言う訳ではなく、インスタンスの整合性を保つには別口の排他ロックが必要ってこと。
じゃあ、atomicってなんなの?
次回に続く! といいな
免責、無保証!