美文网首页
iOS 中atomic与nonatomic区别,以及atomic

iOS 中atomic与nonatomic区别,以及atomic

作者: MiniCoder | 来源:发表于2020-03-12 20:30 被阅读0次

    atomic 与 nonatomic 区别

    nonatomic:非原子属性,线程不安全的,效率高
    atomic:原子属性,线程安全的,效率相对低。
    atomic属性内部的锁称为 自旋锁
    凡是线程安全的对象,内部肯定会加锁。
    1、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
    2、atomic:系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。getter 还是能得到一个完好无损的对象(可以保证数据的完整性),但这个对象在多线程的情况下是不能确定的,也就是说:如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性。

    //虽然atomic是原子性的,但是下面的这种情况是无法保证数据运算完成以后的正确性,

    @property(atomic,assign)NSInteger theCount;
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
            //        @synchronized (self) {
            for(int i =0; i<1000; i++) {
                self.theCount++;
                NSLog(@"theCount in threadA is %ld",(long)self.theCount);
            }
            dispatch_semaphore_signal(self.semaphore);
            
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
            //        @synchronized (self) {
            for(int i =0; i<1000; i++) {
                
                [self.lock lock];
                self.theCount++;
                NSLog(@"theCount in threadB is %ld",(long)self.theCount);
            }
        });
    

    最好的情况是我们在对数据进行运算代码中加锁。

    相关文章

      网友评论

          本文标题:iOS 中atomic与nonatomic区别,以及atomic

          本文链接:https://www.haomeiwen.com/subject/szvwjhtx.html