• atomic nonatomic区别


    摘要

    atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作。atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。nonatomic禁止多线程,变量保护,提高性能。

    1、atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
    nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

    2、atomic的意思就是setter/getter这个函数,是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,可以保证数据的完整性。nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果;

    3、比如setter函数里面改变两个成员变量,如果你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题,就是不完整的。当然如果不需要多线程支持的话,用nonatomic就够了,因为不涉及到线程锁的操作,所以它执行率相对快些。

    示例代码:
    @synthesize testString = _testString;
    - (void)setTestString:(NSString *)testString {
        @synchronized (self) {
            _testString = testString;
        }
    }
    
    - (NSString *)testString {
        @synchronized (self) {
            return _testString;
        }
    }

    或者使用NSLock对象实现:

    - (NSLock *)lock {
        if (!_lock) {
            _lock = [[NSLock alloc] init];
        }
        return _lock;
    }
    
    - (void)testMethod {
        [self.lock lock];
        // code……
        [self.lock unlock];
    }
  • 相关阅读:
    如何去掉myeclipse的web项目启动时出现的 CodeLive Panel
    day35_Spring学习回顾_03
    在CentOS/RHEL上设置SSH免密码登录
    超全Linux备份工具集合,满足你的所有需要!
    使用Gnupg对Linux系统中的文件进行加密
    Linux压缩那些事儿
    或许是 Nginx 上配置 HTTP2 最实在的教程了
    Systemd 三部曲 之 PHP7
    Linux kernel模块管理相关详解
    搜狐视频Redis私有云平台CacheCloud
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5742466.html
Copyright © 2020-2023  润新知