您好,登錄后才能下訂單哦!
小編給大家分享一下iOS如何使用多線程提高數據并發訪問,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
線程同步
現在,讓我們轉向多線程另一個非常重要的部分。由于每一個線程都運行在自己的堆棧中,創建自己的對象,那么你的線程是如何和應用中的其他線程通訊和共享數據的呢?前面提到過,當你在多個線程中共享你的數據結構或對象時是有風險的,因為很多線程會試圖改變對象的數據結構。
首先,我向你介紹一個新的術語叫線程安全。線程安全類(或函數)是這樣的類,你不需要擔心之前提到的安全性問題。這些類要么很小心的使用了鎖進行處理,要么他們是不可變的(他們不會被改變)。下面是線程安全性的類或函數:
NSArray
NSConnection
NSData
NSDate
NSDictionary
NSNumber
NSObject
NSSet
NSString
相反,下面是可變的,非線程安全的類:
NSMutableArray
NSMutableAttributedString
NSMUtableCharacterSet
NSMutableData
NSMutableDictionary
NSMutableSet
NSMutableString
為什么你更應該使用線程安全的類,而不是使用非線程安全的類?為什么你不使用mutble類,但確保使用了鎖?讓我給你一個使用鎖的例子,在用線程訪問對象時可能會改變對象:
NSMutableArray* myArray = GetSharedArray();
id anObject;
if ([myArray count] > 0) {
anObject = [myArray objectAtIndex:0];
}
[anObject doSomething];
這個例子非常簡單,但是你幫你理解了一個非常重要的概念。你看到這段代碼的問題了嗎?在你檢查數組的長度之后,另一個線程可以修改數組,那么數組中可能不再有對象了,因為其他的線程可能刪除了數組中的所有對象。因此,你可以通過使用鎖來解決這個問題,但它不是最好的解決辦法。
這樣會好很多,但是依然還有問題,比如你獲取到的對象可能會被其他線程修改。因此,下一步要把[anObject doSomething];也加入到鎖中。
如果myArray是NSArray,而不是NSMutableArray,你根本就不需要鎖。你可以正常的調用他們。
相對于可變對象來說,這就是使用不可變對象的好處。你可以確保當你在處理這些對象時,沒有人能夠修改或改變他們的屬性。
以上是“iOS如何使用多線程提高數據并發訪問”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。