atomic
和noatomic
的区别是什么?
刚刚学iOS的时候是这样认识的:atomic是线程安全的,但它运行效率慢,noatomic不是线程安全的它他效率高。看了atomic
和noatomic
内部实现后才认识到实际上atomic只是保证了seter getter方法的原子性 noatomic不能保证seter getter方法的原子性。
atomic的seter getter内部实现
- (void)setCurrentImage:(UIImage *)currentImage
{
@synchronized(self) {
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
}
}
}
- (UIImage *)currentImage
{
@synchronized(self) {
return _currentImage;
}
}
atomic的seter getter内部实现是用了互斥锁来保证seter getter方法在多线程中的安全,但atomic修饰的对象是我们自定义的,可能并没有加锁,在多线程中atomic修饰对象并不能保证线程安全。
nonatomic对象setter和getter方法的实现:
- (void)setCurrentImage:(UIImage *)currentImage
{
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
}
}
- (UIImage *)currentImage
{
return _currentImage;
}
nonatomic对象setter和getter方法的实现并么有加互斥锁,所以nonatomic修饰的对象是非线程安全的,同时nonatomic对象setter和getter方法也是非线程安全的,但也正因为没有互斥锁所以性能要比atomic好
如果既要atomic修饰的对象线程安全也要atomic的seter getter方法具有原子性,那就需要给atomic修饰的对象加互斥锁,但这会进一步降低atomic的性能。
https://academy.realm.io/posts/tmi-objective-c-property-attributes/
网友评论