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ってなんなの?


次回に続く!  といいな


免責、無保証!