atomic并不能达到真正的线程安全,atomic只是对setter和getter方法加锁,如下所示
#import@interface Person : NSObject@property (copy) NSString *name;@endThread A:p.name = @"Rob";Thread B:p.name = @"Robert";Thread A:label.string = p.name; // 可能读取的数据是Robert
可能会出现这样的情况:线程A刚修改了name的值,正要读取name的值,但是就在读取前的一瞬间name被线程A修改了。因此要想实现真正的线程安全,需要对对象进行加锁,读取操作结束的时候再开放给其他线程访问
Thread A:[p lock];// Thread B 不能访问p对象p.name = @"Rob";NSString *name = p.name;[p unlock];Thread B:[p lock];// Thread A 不能访问p对象[p unlock];
p.name = @"Rob";NSString *name = p.name;
应该在一个共有的方法里面,所有线程都会调用这个方法