iOS 中關於 synchronized的一點思考

2021-08-11 06:40:18 字數 1729 閱讀 5352

首先我們知道@synchronized 的作用是建立乙個互斥鎖,保證此時沒有其它執行緒對鎖物件進行修改。這個是objective-c的乙個鎖定令牌,防止鎖物件在同一時間內被其它執行緒訪問,起到執行緒的保護作用。

指令@synchronized()通過對一段**的使用進行加鎖。其他試圖執行該段**的執行緒都會被阻塞,直到加鎖執行緒退出執行該段被保護的**段

執行緒同步:多天線程在同一條線上執行(按順序的執行任務)

互斥鎖就是使用了執行緒同步技術

下面看互斥鎖使用格式

@synchronized (鎖物件)

鎖定乙份**只能用一把鎖,多把鎖是無效的。

優點:防止多執行緒操作時資源競爭導致的資料安全問題

缺點:需要消耗大量的cpu資源

互斥鎖的使用前提是:多條執行緒使用同乙份資源。

檢視該段的彙編**可知主要使用了兩個函式

_objc_sync_enter

_objc_sync_exit

在objective-c 中檢視原始碼

int objc_sync_enter(id obj)

else

objc_sync_nil();

}return result;

}// end synchronizing on 'obj'.

// returns objc_sync_success or objc_sync_not_owning_thread_error

int objc_sync_exit(id obj)

else

}} else

return result;

}

檢視syncdata

typedef struct syncdata  syncdata;

可見在syncdata 維護了乙個遞迴鎖,所以如下**就不會死鎖。

@synchronized (obj) 

}

但是並不意味著

synchronized不會死鎖,類似下面的**還是會導致死鎖的

@synchronized (self)

正確使用@synchronized還需要注意粒度控制

@synchronized (token) 

@synchronized (token)

使用同乙個token來同步arra和arrb的訪問,雖然arra和arrb之間沒有任何聯絡。傳入self的就更不對了。

應該是不同的資料使用不同的鎖,盡量將粒度控制在最細的程度。上述**應該是:

@synchronized (tokena) 

@synchronized (tokenb)

@synchronized(nil)不起任何作用,所以傳參時還是需要做好判斷

注意內部的函式呼叫

@synchronized (tokena)

在  dosomething:中可能有更多的函式呼叫,這樣就會導致@synchronized更慢,所以建議@synchronized內加鎖的**還是盡量簡單的好,

如果無法避免,還是要做好維護工作

Delphi中多執行緒中Synchronize的運用

delphi中多執行緒用synchronize實現vcl資料同步顯示,delphi中多執行緒用synchronize實現vcl資料同步顯示 概述 vcl實現同步的另一種方法就是呼叫執行緒類的synchronize的過程,此過程需要乙個無引數的procedure,故在此procedure中無法傳遞引數...

java中的lock和synchronized區別

1 reentrantlock 擁有synchronized相同的併發性和記憶體語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候 執行緒a和b都要獲取物件o的鎖定,假設a獲取了物件o鎖,b將等待a釋放對o的鎖定,如果使用 synchronized 如果a不釋放,b將一直等下去,不能被中斷 如果 使用...

ios中關於delegate(委託)

ios中關於delegate 委託 的使用心得 直覺 從開始從事oc工作到現在大概1年多了,從當初接觸oc的 協議 的不明白,到現在 中隨處可見的委託,協議,其中感悟頗多。首先,大家應該都明白的是委託是協議的一種,顧名思義,就是委託他人幫自己去做什麼事。也就是當自己做什麼事情不方便的時候,就可以建立...