首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

iOS 中常见的几种锁-代码示例(7)

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];
    }
    复制代码
返回列表