OC和Swift下的线程安全属性

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

最终在下面这个线程任

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值