一,原子性
原子操作是不可分割的操作,在原子操作执行完毕之前,其不会被任何其它任务或事件中断。
二,atomic和nonatomic的区别:
atomic:
1,原子属性,为系统默认的属性
2,会为修饰的成员变量的setter方法自动加锁(自旋锁),使得线程安全,但较为消耗资源,效率相对低些。是一种单写多读的多线程技术,可能出现脏数据。
nonatomic:
1,非原子属性,开发中最常用的属性
2,不会为修饰的成员变量的setter方法加锁,虽然线程不安全,但效率高。
注:
1,如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性。
2,atomic可以保证setter和getter存取方法的线程安全并不保证整个对象是线程安全的。
3,nonatomic返回你的对象可能就不是完整的value。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果。但仅仅使用atomic并不会使得对象线程安全,我们还要为对象线程添加lock来确保线程的安全。
4,atomic与nonatomic的本质区别其实也就是在setter方法上的操作不同。
三,自旋锁和互斥锁
共同点:
都能够保证线程安全
不同点:
互斥锁:如果线程被锁在外面,就会进入休眠状态,等待锁打开,然后被唤醒!
自旋锁:如果线程被锁在外面,就会用死循环的方式,一直等待锁打开!
注:无论什么锁,都很消耗新能.效率不高
参考链接:
https://blog.csdn.net/u012903898/article/details/82984959
https://www.jianshu.com/p/87e922b25526
网友评论