ios多線程

1.線程相關概念

進程是指在系統中正在運行的一個應用程序
進程和進程之間時相互獨立的:在內存當中都有屬於自己的一段內存空間
線程:一個進程可以有多個線程組成(1個進程至少要有一個線程(主線程)
多線程的作用:解決程序阻塞問題
                 提升程序到執行效率
單核cpu的情況下,多線程時快速的在多個線程之間切換
如果線程非常多的話,cpu在多個線程之間來回切換,會降低程序的性能

多線程 優點:
  • 能適當提高程序的執行效率
  • 能適當提高資源的利用率(cpu,內存)
  • 線程上的任務執行完成後,線程會自動銷燬

  • 缺點
  • 開啓線程需要佔用一定的內存空間(默認情況下,每一個線程都佔512KB)
  • 如果開啓大量的線程,會佔用大量的內存空間,降低程序的性能
  • 線程越多,cpu在調用線程上的開銷就越大
  • 程序設計更加複雜,比如多線程的數據共享、線程間的通信
2.oc中線程的創建方式:
  • 方式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];


4. 線程的屬性:
線程名稱:設置線程名稱可以當線程執行的方法內部出現異常的時候紀錄 異常信息
線程優先級:
內核調度的時候,較高的優先級線程比較低的線程具有更多的機會調度

5.線程安全問題:
    當多線程同時訪問共享資源的時候,會造成數據安全問題
    解決:加鎖
   1.互斥鎖:
oc中互斥鎖:@synchronized(鎖對象) {  執行的代碼塊 }
        oc中加鎖是加在代碼塊上,不是變量,或共享資源上
        oc中互斥鎖原理:

  • 互斥鎖原理
  • 每一個對象(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的類都是線程不安全的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章