atomic的一些理解

本文探讨了atomic属性如何确保getter和setter方法的线程安全,同时指出它并不保证整个对象的安全性。此外,还对比了atomic与nonatomic的区别,以及synchronized与atomic锁机制的不同。

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

在多线程中,atomic只保证getter、setter方法安全,并不保证其它操作,例如字符串拼接,数组移除元素等

-(void)setMstrOrigin:(NSString *)mstrOrigin{

    @synchronized(self){

        if(_mstrOrigin != mstrOrigin){

            [_mstrOrigin release];

            _mstrOrigin = [mstrOrigin retain];

        }

    }

}

-(NSString *)mstrOrigin{

    @synchronized(self){

        return _mstrOrigin;

    }

}

 

atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,保证用户拿到一个完整的值,也就是保证数据的完整性,并不能保证整个对象是线程安全的。若要对象线程安全,还需要为对象线程加锁。

 

atomic:线程安全,需要消耗大量的资源

nonatomic:非线程安全,适合内存小的移动设备

synchronized 与 atomic

互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会自动唤醒然后执行任务。

自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。

自旋锁应用场景:
比较适合做一些不耗时的操作

synchronized:互斥锁

atomic:自旋锁

共同点:都能保证同一时刻只能有一个线程操作锁住的代码线程安全,需要消耗大量的资源

nonatomic:非线程安全,适合内存小的移动设备

synchronized 与 atomic

互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会自动唤醒然后执行任务。

自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。

自旋锁应用场景:
比较适合做一些不耗时的操作

synchronized:互斥锁

atomic:老版本底层是 自旋锁,新版本不再是了

共同点:都能保证同一时刻只能有一个线程操作锁住的代码

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值