最近看了很多关于属性线程安全的问题,即在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);
});
最终在下面这个线程任