iOS线程安全同步的三类模式

原创
2016/03/18 17:37
阅读数 773
  1. 使用dispatch_once进行线程同步

+(TaskThreadManager *)sharedInstance
{
        static TaskThreadManager *sharedManager; //注意,这里和C语言一样是静态变量,不要认为是普通变量
    
        static dispatch_once_t onceToken = 0;
        dispatch_once(&onceToken, ^{
            
            sharedManager = [[TaskThreadManager alloc] init];
          
        });
   
    return sharedManager;
}

注意: onceToken必须是静态的,并且初始值必须是0(因为onceToken最终标志会变为负值,从而指示队列放弃已经执行过的任务),这样才能保证dispatch_once仅仅执行一次,否则要么不执行(小于0时),要么多次执行(大于0)

 

2.使用@synchronize同步锁

- (void)objectMethodTask:(id)anyShareObject  
{  
    @synchronized(self)  //anyShareObject看做资源,必须和其他线程共享,否则无法互斥
    {  
        
    }  
}

当然,对于类方法,我们需要换一种思路,在类方法中,类方法默认的锁是类本身,因此加锁如下

+(void)classMethodTask{  
    @synchronized([self class])  //self class看做资源,必须和其他线程共享,否则无法互斥
    {  
        
    }  
}

当然,我们也可以使用静态变量来作为类方法的锁资源,因为这样也是满足资源竞争的,从而产生互斥

+(void)classMethodTask{  
    static NSString * staticLock = @"static.lock";
    @synchronized(staticLock )  //self class看做资源,必须和其他线程共享,否则无法互斥
    {  
        
    }  
}

然后我们调用

NSObject * lockSelf = self;

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:)toTarget:self withObject:lockSelf];

NSThread* myThread = [[NSThread alloc] initWithTarget:self  
                            selector:@selector(myThreadMainMethod:)  
                            object:lockSelf];  
[myThread start];  

------------------------------------------------------------------------------------------------------------------------------------------

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:)toTarget:[self class] withObject:nil];

NSThread* myThread = [[NSThread alloc] initWithTarget:[self class]
                            selector:@selector(myThreadMainMethod:)  
                            object:nil];  
[myThread start];

3.使用线程锁NSLock和NSCondition

static NSLock *lockMain = nil;
if (lockMain == nil) {
        lockMain = [[NSLock alloc] init];
    }
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [lockMain tryLock];
        NSLog(@"A thread begin +!");
        [NSThread sleepForTimeInterval:10];
        NSLog(@"A thread + done and unlock!");
        [lockMain unlock];
        [lockMain lock];
        NSLog(@"A thread begin -!");
        [NSThread sleepForTimeInterval:10];
        NSLog(@"A thread - done and unlock!");
        [lockMain unlock];
    });

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部