多執行緒非同步安全,安全鎖的問題

weixin_33850890發表於2017-06-29

本篇文章主要介紹多執行緒在非同步時候的內部程式碼呼叫。以及加鎖時候程式碼的呼叫。比較明顯的使用地點是資料庫操作。資源競爭。

首先我們常用到的鎖有以下幾種:

@synchronizad、atomic、NSLook、NSRecursiveLock(遞迴鎖)



接下來先逐一簡單介紹一下這些個執行緒鎖:

1. @synchronizad

這個是常規的區域性程式碼鎖。使用方式:

```@synchronized(lock){

     A程式碼

}```

```@synchronized(lock){

     B程式碼

}```

lock 是id型別,只要求唯一性就可以。

加密後相當於佇列效果,執行完A之後才會執行B。即便是兩個非同步執行緒。


2.aotomic

這個屬於屬性鎖,也就是原子操作。一個@property使用了這個關鍵字之後,他的setter方法會自動枷鎖。加鎖方式用的就是@synchronizad。  但是這個屬性不要隨便亂用,第一他的效能消耗太高,是noaotomic的20倍差不多。而且,僅僅對setter方法加鎖是有漏洞的,具體例子就是讀取和set的順序問題。


3.NSLook

有點類似於@synchronized  保證多執行緒程式碼安全

lock = [[NSLock alloc] init];

[lock lock];

//程式碼塊

[lock unlock];

4.NSCondition

條件鎖,只有達到條件之後,才會執行鎖操作

BOOL canLock = [conditionLock tryLockWhenCondition:condition];

5.NSRecursiveLock  

遞迴鎖主要防止崩潰,一個程式碼塊裡多次加鎖

比如:自身呼叫自身加鎖。


下面介紹一下多執行緒中加鎖:先貼幾行程式碼:





待更新。。。

相關文章