###atomic和nonatomic的区别— layout: post title: Sample Post date: 2018-06-04 17:42:24.000000000 +09:00 —###
atomic
nonatomic
对于atomic关键字修饰的属性而言,系统生成的gette/setter方法会保证在进行get/set操作时的完整性,不会受到其余线程的影响,可以保证读写操作的安全性.例如:线程A的getter方法运行到一半,线程B调用了setter方法,此时线程A的getter方法还是能获取到一个完好无损的对象,这是一个串行的操作.但是如果是nonatomic修饰的属性,当多个线程同时对属性进行读写操作,会进行并发访问,可能会产生不可预知的问题,例如crash.
atomic可以保证属性的读写是安全的,但是atomic无法保证值的时效性,例如:线程A调用了getter,与此同时线程B和C都调用的setter,此时A get到的值可能是B set的值,也可能是C set的或者最初的值,因为无法确定是哪个线程先执行完成,但是会保证一定会有值.
代码: nonatomic修饰属性生成的getter/setter方法
atomic修饰属性生成的getter/setter方法
关于@sychronized同步锁,在atomic关键字修饰后创建的setter/getter方法中并不是使用的@sychronized同步锁,因为同步锁只能保证当前线程的运行完整性,无法保证具体是哪一个线程,所以还是会存在atomic本身的问题,所以atomic真正使用的是自旋锁,其实我们在开发中也可以通过GCD的栅栏过滤来模拟自旋锁,达到同样的效果.