标签:des style blog http io ar os 使用 java
nonatomic和atomic修饰的属性,在自己没有重写setter和getter的时候才会发生作用,其主要的作用可以理解为,atomic修饰的setter和getter在多线程下面是互斥的,相当于setter和getter中开始和结束的地方加锁了。
stackoverflow上面对atomic解释赞同最多的答案:
atomic不等于线程安全,对于常见的引用、指针、4字节(位宽字节)的变量,其赋值操作本身就是原子的 ,没有必要加上atomic,对于结构体类型,atomic才会起到作用。
线程安全问题是指多个线程在读写共享的变量时造成内存紊乱的问题,解决线程安全问题就必须保证多线程读写同一变量时代码序列是串行的,保证读写过程中不会穿插执行。常用的方法除了使用线程安全方法、加锁之外,还可以将读写的代码放在同一个队列中。
apple给出了一些线程不安全的类,这些类创建的对象(变量)在多线程中访问是不安全的。通常不可改变的对象(Immutable)是线程安全的,可改变的对象不是线程安全的(mutable)。
线程安全的类:
NSCalendarDate
NSConnection
NSDecimal
functions
NSDeserializer
NSDistantObject
NSDistributedLock
NSDistributedNotificationCenter
NSFileManager
(in OS X v10.5 and later)
NSHost
NSPortCoder
NSPortMessage
NSPortNameServer
NSProtocolChecker
Object allocation and retain count functions
Zone and memory functions
NSArchiver
NSHashTable
functions
NSJavaSetup
functions
NSMapTable
functions
NSSerializer
NSTask
NSUnarchiver
例如这样声明的对象:
@property (nonatomic , strong) NSMutableArray * array;
array在多线程访问,比如一个线程遍历数组,另外一个线程删除或者插入元素时,程序会直接crash,提示指针异常。同样的道理,atomic修饰的属性,并不能保证多线程读写对象内部元素的安全性,因此atomic不是线程安全的。
标签:des style blog http io ar os 使用 java
原文地址:http://www.cnblogs.com/doudouyoutang/p/4075226.html