最近看了很多关于属性线程安全的问题,即在OC中的atomic和noatomic对线程安全的理解。
在property中,默认是atomic原子性的,但我们在属性的定义中一般使用noatomic,因为这种的效率是前者的20倍。但在多线程处理机的今天,我们无可避免的需要面向多线程编程,今天我们就谈谈这个atomic对属性的线程安全到底有多少影响。
atomic的线程安全的目标是谁,setter和getter 方法。就是说我们多线程单独访问getter方法或者是setter方法时是线程安全的。所以atomic的线程不安全还体现在两个方面。
1.set和get操作可同时在两个线程中进行。意思说两个线程不允许同时get,也不允许同时set操作,但是可以一个线程一直读,一个线程一直写。这样在另一个线程中读出的数据就不是可控的,这很危险。(亲测)
//1.创建一个并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加两个任务
dispatch_async(queue, ^{
sleep(3);
self.atomicTestString = @"write1";
NSLog(@"写完");
sleep(1);
self.atomicTestString = @"write2";
sleep(1);
self.atomicTestString = @"write3";
});
dispatch_async(queue, ^{
sleep(3);
NSLog(@"读完%@",self.atomicTestString);
sleep(1);
NSLog(@"读完%@",self.atomicTestString);
});
最终在下面这个线程任

本文讨论了Objective-C中atomic与nonatomic属性对于线程安全的影响,指出atomic仅保证setter和getter的线程安全,但无法确保对象整体的安全。在多线程环境下,为了确保属性的线程安全,通常需要使用线程锁。Swift中,属性默认并非线程安全,可以通过特定方式实现线程安全。
最低0.47元/天 解锁文章
1809





