IOS nonatomic 与 atomic 的区别

本文探讨了iOS开发中atomic与nonatomic属性的区别,解释了它们如何影响多线程环境下的属性读写操作,并讨论了自旋锁与互斥锁的作用。

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

atomic:原子属性,多线程写入属性时,保证同一时间只有一个线程能够写入操作,单线程写,多线程读的操作,读写相对安全的

atomic 内部有一把锁:自旋锁

自旋锁:如果发现其他线程正在执行锁定的代码。线程就会出现死循环,等待线程完成就执行锁定代码

开发中经常使用 nonatomic  修饰属性,原因是因为:锁的开销比较大,容易造成性能问题。nonatomic 是线程不安全的,但是atomic 也不是绝对的安全,只是能降低不安全的概率。

在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备 nonatomic 特质,则不使用互斥锁(atomic 的底层实现,老版本是自旋锁,iOS10开始是互斥锁--spinlock底层实现改变了。)。请注意,尽管没有名为“atomic”的特质(如果某属性不具备 nonatomic 特质,那它就是“原子的”(atomic))。

在iOS开发中,你会发现,几乎所有属性都声明为 nonatomic。

一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全” ( thread safety),若要实现“线程安全”的操作,还需采用更为深层的加锁机制才行。例如,一个线程在连续多次读取某属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为 atomic,也还是会读到不同的属性值。

因此,开发iOS程序时一般都会使用 nonatomic 属性。但是在开发 Mac OS X 程序时,使用 atomic 属性通常都不会有性能瓶颈。

 

nonatomic的实现:
- (void)setMyAtomic(UIImage *)MyAtomic
{
    if (_
MyAtomic != MyAtomic) {
        [_
MyAtomic release];
        _
MyAtomic = [MyAtomic retain];
            
        // do something
    }
}
- (UIImage *)
MyAtomic
{
    return _
MyAtomic;
}


atomic的实现:
- (void)setMyAtomic:(UIImage *)MyAtomic
{
    @synchronized(self) {
        if (_
MyAtomic != MyAtomice) {
            [
MyAtomic release];
            _
MyAtomic = [MyAtomic retain];
                    
            // do something
        }
    }
}

- (UIImage *)
MyAtomic
{
    @synchronized(self) {
        return _
MyAtomic;
    }
}


- (void)myMethod:(id)anObj
{
    @synchronized(anObj)
    {
   
    }
}
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值