atomic的一些理解

在多线程中,atomic只保证getter、setter方法安全,并不保证其它操作,例如字符串拼接,数组移除元素等

-(void)setMstrOrigin:(NSString *)mstrOrigin{

    @synchronized(self){

        if(_mstrOrigin != mstrOrigin){

            [_mstrOrigin release];

            _mstrOrigin = [mstrOrigin retain];

        }

    }

}

-(NSString *)mstrOrigin{

    @synchronized(self){

        return _mstrOrigin;

    }

}

atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,保证用户拿到一个完整的值,也就是保证数据的完整性,并不能保证整个对象是线程安全的。若要对象线程安全,还需要为对象线程加锁。

atomic:线程安全,需要消耗大量的资源

nonatomic:非线程安全,适合内存小的移动设备

synchronized 与 atomic

互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会自动唤醒然后执行任务。

自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。

自旋锁应用场景:
比较适合做一些不耗时的操作

synchronized:互斥锁

atomic:自旋锁

共同点:都能保证同一时刻只能有一个线程操作锁住的代码



猜你喜欢

转载自blog.csdn.net/HuberCui/article/details/79832257
今日推荐