在iOS中有幾種方法來解決多線程訪問同一個內存地址的互斥同步問題:
方法一,@synchronized(id anObject),(最簡單的方法)
會自動對參數對象加鎖,保證臨界區內的代碼線程安全
@synchronized(self)
{
// 這段代碼對其他 @synchronized(self) 都是互斥的
// self 指向同一個對象
}
方法二,NSLock
NSLock對象實現了NSLocking protocol,包含幾個方法:
比如:
NSLock *theLock = [[NSLock alloc] init];
if ([theLock lock])
{
//do something here
[theLock unlock];
}
方法三,NSRecursiveLock,遞歸鎖
NSRecursiveLock,多次調用不會阻塞已獲取該鎖的線程。
NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];
void MyRecursiveFunction(int value)
{
[theLock lock];
if (value != 0)
<span style="font-size:14px;"> </span>{
–value;
MyRecursiveFunction(value);
}
[theLock unlock];
}
MyRecursiveFunction(5);
方法四,NSConditionLock,條件鎖
NSConditionLock,條件鎖,可以設置條件
//公共部分
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
//線程一,生產者
while(true) {
[condLock lockWhenCondition:NO_DATA];
//生產數據
[condLock unlockWithCondition:HAS_DATA];
}
//線程二,消費者
while (true) {
[condLock lockWhenCondition:HAS_DATA];
//消費
[condLock unlockWithCondition:NO_DATA];
}
方法五,NSDistributedLock,分布鎖
NSDistributedLock,分布鎖,文件方式實現,可以跨進程
如果一個獲取鎖的進程在釋放鎖之前掛了,那麼鎖就一直得不到釋放了,此時可以通過breakLock強行獲取鎖。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。