原子性和非原子行相对于线程的安全来讲
nonatomic:非原子属性,线程不安全的,效率高
atomic:原子属性,线程安全的,效率相对低。
原子属性是一种单(线程)写多(线程)读的多线程技术,不过可能会出现脏数据
atomic属性内部的锁称为 自旋锁
凡是线程安全的对象,内部肯定会加锁。
自旋锁和互斥锁
相同点:都能保证同一时间只有一个线程访问共享资源。都能保证线程安全。
不同点:
互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。
自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
自旋锁的效率高于互斥锁。
atomic属性内部的锁称为 互斥锁 ,并不是自旋锁。
atomic的实现:
- (void)setCurrentImage:(UIImage *)currentImage
{
@synchronized(self) {
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
// do something
}
}
}
- (UIImage *)currentImage
{
@synchronized(self) {
return _currentImage;
}
}
atomic 的setter方法中 多了一个 @synchronized(self) {},这个语句的功能是:等待当前对象操作完毕并合成确定值,所以是互斥锁
@synchronized(self)的用法:
@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。
https://www.cnblogs.com/jukaiit/p/5570056.html
网友评论