標籤:des style blog http io ar os 使用 java
- 在聲明一個類的屬性時,預設這個屬性會被修飾atomic,意思是原子性訪問的。
nonatomic和atomic修飾的屬性,在自己沒有重寫setter和getter的時候才會發生作用,其主要的作用可以理解為,atomic修飾的setter和getter在多線程下面是互斥的,相當於setter和getter中開始和結束的地方加鎖了。
stackoverflow上面對atomic解釋贊同最多的答案:
atomic不等於安全執行緒,對於常見的引用、指標、4位元組(位寬位元組)的變數,其賦值操作本身就是原子的 ,沒有必要加上atomic,對於結構體類型,atomic才會起到作用。
安全執行緒
安全執行緒問題是指多個線程在讀寫共用的變數時造成記憶體紊亂的問題,解決安全執行緒問題就必須保證多線程讀寫同一變數時代碼序列是串列的,保證讀寫過程中不會穿插執行。常用的方法除了使用安全執行緒方法、加鎖之外,還可以將讀寫的代碼放在同一個隊列中。
apple給出了一些線程不安全的類,這些類建立的對象(變數)在多線程中訪問是不安全的。通常不可改變的對象(Immutable)是安全執行緒的,可改變的對象不是安全執行緒的(mutable)。
安全執行緒的類:
NSArray
NSAssertionHandler
NSAttributedString
NSCalendarDate
NSCharacterSet
NSConditionLock
NSConnection
NSData
NSDate
NSDecimal functions
NSDecimalNumber
NSDecimalNumberHandler
NSDeserializer
NSDictionary
NSDistantObject
NSDistributedLock
NSDistributedNotificationCenter
NSException
NSFileManager (in OS X v10.5 and later)
NSHost
NSLock
NSLog/NSLogv
NSMethodSignature
NSNotification
NSNotificationCenter
NSNumber
NSObject
NSPortCoder
NSPortMessage
NSPortNameServer
NSProtocolChecker
NSProxy
NSRecursiveLock
NSSet
NSString
NSThread
NSTimer
NSTimeZone
NSUserDefaults
NSValue
NSXMLParser
Object allocation and retain count functions
Zone and memory functions
線程不安全的類:
例如這樣聲明的對象:
@property (nonatomic , strong) NSMutableArray * array;
array在多線程訪問,比如一個線程遍曆數組,另外一個線程刪除或者插入元素時,程式會直接crash,提示指標異常。同樣的道理,atomic修飾的屬性,並不能保證多線程讀寫對象內部元素的安全性,因此atomic不是安全執行緒的。
IOS 類的屬性修飾符atomic