基本鎖:自旋鎖、互斥鎖、讀寫鎖,其他如條件鎖、遞歸鎖、信號量都是上層封裝實現的。
鎖的性能從高到低是:
OSSpinLock >
Dispatch_semaphone(信號量)>;
Pthread_mutex(互斥)>;
NSLock(互斥鎖) >
NSCondition(條件鎖) >
Pthread_mutex(遞歸互斥遞歸鎖)>;
NSRecursiveLock >:
NSConditionLock >
同步(互斥)
將出現死鎖。
使用NSLock鎖定臨界區,進入方法2,再次鎖定同壹個鎖,會因為重入導致死鎖。
采用遞歸鎖來解決問題,利用了它的重入特性:壹個線程可以添加N個鎖,不會造成死鎖。
調度信號量的三種關鍵方法
所以可以看出,信號量壹般處理鎖定(互斥)、異步返回、控制線程並發。
關註多線程並發安全性。下面的例子都是基於總共20張票,賣出10張票。我們來模擬壹下:
可見數據其實是混亂的。
然後我們必須添加互斥鎖來確保線程安全,如下所示
可見數據正常,方法也可以。
這裏有另壹個解決方案,信號量處理。信號量的優勢看問題2鎖的性能,包括dispatch _ semaphone >;NSLock(互斥鎖)而且由於這個問題的數據量比較小,如果同步操作比較復雜,還是用信號量比較好,所以我們用信號量來保證離線過程的安全。