Board logo

标题: iOS 中常见的几种锁-代码示例(7) [打印本页]

作者: look_w    时间: 2019-3-10 14:29     标题: iOS 中常见的几种锁-代码示例(7)

7. property - atomic / nonatomic

    atomic 修饰的对象,系统会保证在其自动生成的 getter/setter 方法中的操作是完整的,不受其他线程的影响。例如 A 线程在执行 getter 方法时,B线程执行了 setter 方法,此时 A 线程依然会得到一个完整无损的对象。

atomic

    默认修饰符 会保证CPU能在别的线程访问这个属性之前先执行完当前操作 读写速度慢 线程不安全 - 如果有另一个线程 D 同时在调[name release],那可能就会crash,因为 release 不受 getter/setter 操作的限制。也就是说,这个属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。

nonatomic

    不默认 速度更快 线程不安全 如果两个线程同时访问会出现不可预料的结果。



8. Once 原子操作
8.1 GCD

     
    - (id)lock15 {
        static id shareInstance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (!shareInstance) {
                shareInstance = [[NSObject alloc] init];
            }
        });
        return shareInstance;
    }
    复制代码

8.2 pthread

    - (void)lock16 {
        pthread_once_t once = PTHREAD_ONCE_INIT;
        pthread_once(&once, lock16Func);
    }
    void lock16Func() {
         static id shareInstance;
        shareInstance = [[NSObject alloc] init];
    }
    复制代码




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0