- 能適當提高程序的執行效率
- 能適當提高資源的利用率(cpu,內存)
- 線程上的任務執行完成後,線程會自動銷燬
- 缺點
- 開啓線程需要佔用一定的內存空間(默認情況下,每一個線程都佔512KB)
- 如果開啓大量的線程,會佔用大量的內存空間,降低程序的性能
- 線程越多,cpu在調用線程上的開銷就越大
- 程序設計更加複雜,比如多線程的數據共享、線程間的通信
- 方式1
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo:) object:nil];
[thread start];
- 方式2
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:nil];
- 方式3
[self performSelectorInBackground:@selector(demo:) withObject:nil];
- 互斥鎖原理
- 每一個對象(NSObject)內部都有一個鎖(變量),當有線程要進入synchronized到代碼塊中會先檢查對象的鎖是打開還是關閉狀態,默認鎖是打開狀態(1),如果是線程執行到代碼塊內部 會先上鎖(0)。如果鎖被關閉,再有線程要執行代碼塊就先等待,直到鎖打開纔可以進入。
線程執行到synchronized
i. 檢查鎖狀態 如果是開鎖狀態(1)轉到ii 如果上鎖(0)轉到v
ii. 上鎖(0)
iii. 執行代碼塊
iv. 執行完畢 開鎖(1)
v. 線程等待(就緒狀態)
加鎖後程序執行的效率比不加鎖的時候要低,因爲要線程要等待鎖,但是鎖保證了多個線程同時操作全局變量的安全性
- 屬性中的修飾符
- nonatomic 非原子屬性
- atomic 原子屬性(線程安全),針對多線程設計的,默認值
保證同一時間只有一個線程能夠寫入(但是同一個時間多個線程都可以取值)
單寫多讀:單個線程寫入,多個線程可以讀取
atomic 本身就有一把鎖(自旋鎖)
- nonatomic和atomic對比
- atomic:線程安全,需要消耗大量的資源
- nonatomic:非線程安全,適合內存小的移動設備
- 互斥鎖
- 如果發現其他線程正在執行鎖定代碼,線程會進入休眠(就緒狀態),等其它線程時間片到打開鎖後,線程會被喚醒(執行)
- 自旋鎖
- 如果發現有其它線程正在鎖定代碼,線程會用死循環的方式,一直等待鎖定的代碼執行完成 自旋鎖更適合執行不耗時的代碼
- 幾乎所有UIKit類庫提供的類都是線程不安全的,所有更新UI的操作都在主線程上執行
- 所有包含NSMutable的類都是線程不安全的