首先我們知道@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的 協議 的不明白,到現在 中隨處可見的委託,協議,其中感悟頗多。首先,大家應該都明白的是委託是協議的一種,顧名思義,就是委託他人幫自己去做什麼事。也就是當自己做什麼事情不方便的時候,就可以建立...