在高并行的代碼環(huán)境中,我們常常會碰到這樣的情況:多個線程同時訪問某一段代碼,產(chǎn)生資源競爭勇哗,導致程序異常。線程鎖可以幫我們解決這樣的問題寸齐,它可以讓這些并行的線程同步地訪問這段代碼欲诺,讓我們的程序正常執(zhí)行。通過解決下面這個問題(參見 http://www.reibang.com/p/b3bd070cd372 )渺鹦,介紹幾種常用線程鎖的用法扰法。
- (void)testDispatchSemaphore
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSMutableArray *mutableArray = [NSMutableArray array];
for (int i = 0; i < 100000; ++i) {
dispatch_async(queue, ^{
[mutableArray addObject:[NSNumber numberWithInt:i]];
});
}
}
一、NSLock
NSLock *lock = [[NSLock alloc] init];
for (int i = 0; i < 100000; ++i) {
dispatch_async(queue, ^{
//加鎖
[lock lock];
//需要加鎖的代碼
[mutableArray addObject:[NSNumber numberWithInt:i]];
//解鎖
[lock unlock];
});
}
三步:
- 初始化鎖:
NSLock *lock = [[NSLock alloc] init];
- 對代碼加鎖:
[lock lock];
- 對代碼解鎖:
[lock unlock];
二毅厚、pthread_mutex
static pthread_mutex_t pLock;
pthread_mutex_init(&pLock, NULL);
for (int i = 0; i < 100000; ++i) {
dispatch_async(queue, ^{
//加鎖
pthread_mutex_lock(&pLock);
//需要加鎖的代碼
[mutableArray addObject:[NSNumber numberWithInt:i]];
//解鎖
pthread_mutex_unlock(&pLock);
});
}
四步:
- 聲明:
static pthread_mutex_t pLock;
這里需要聲明為靜態(tài)變量塞颁,不然參數(shù)類型不匹配。
- 初始化:
pthread_mutex_init(&pLock, NULL);
- 加鎖
pthread_mutex_lock(&pLock);
- 解鎖
pthread_mutex_unlock(&pLock);
三吸耿、@synchronized
for (int i = 0; i < 100000; ++i) {
dispatch_async(queue, ^{
@synchronized (self) {
[mutableArray addObject:[NSNumber numberWithInt:i]];
}
});
}
最簡單祠锣,但是性能最差
四、Dispatch Semaphore
我寫的另一篇文章有分析到咽安,詳情見http://www.reibang.com/p/b3bd070cd372
綜合性能和可讀性伴网,我比較喜歡NSLock,對性能要求較高的童鞋可以使用pthread_mutex_t和Semaphore妆棒。自旋鎖OSSpinLock被蘋果工程師證實不安全澡腾,蘋果使用pthread_mutex_t進行了替代沸伏,谷歌使用Semaphore。