OC面試題目合集地址
基本的鎖: 自旋鎖 、 互斥鎖 、 讀寫鎖 ,其他的比如 條件鎖 、 遞歸鎖 、 信號量 都是上層的封裝和實現。
鎖的性能從高到底依次是:
OSSpinLock(自旋鎖) >
dispatch_semaphone(信號量) >
pthread_mutex(互斥鎖)>
NSLock(互斥鎖)>
NSCondition(條件鎖) >
pthread_mutex(recursive 互斥遞歸鎖)>
NSRecursiveLock(遞歸鎖)>
NSConditionLock(條件鎖)>
synchronized(互斥鎖)
會發生 死鎖
使用NSLock對臨界區進行加鎖, 進入方法2, 方法2裏面對同壹把鎖又進行了lock方法, 這種情況會由於重入原因發生 死鎖
用遞歸鎖解決, 利用其重入特性: 壹個線程可以加N次鎖而不會引發死鎖
dispatch_semaphore_t 的關鍵3個方法
所以看出信號量壹般處理 加鎖(互斥) , 異步返回 , 控制線程並發數 這些場景。
重點考察多線程並發安全這壹情況, 下面例子都以總20張票, 賣10張, 模擬壹下:
可看出數據其實是錯亂的
那麽我們肯定是要加互斥鎖, 來保證線程安全, 如下
可看出數據正常, 方法沒問題是可以的。
這裏再提供另外壹個解法, 信號量 處理。 信號量 優勢看下 問題2 鎖的性能 , 其中有 dispatch_semaphone(信號量) > NSLock(互斥鎖) 。 並且因為這道題數據量比較小, 如果復雜同步操作, 還是用 信號量 好壹些, 那麽我們用 信號量 保證下線程安全