【转】Object-C 多线程中锁的使用-NSLock

在多线程的编程环境中,锁的使用必不可少!
于是,今天来总结一下为共享资源加锁的操作方法。
 
一、使用synchronized方式
 

    //线程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        @synchronized(_myLockObj){

            [obj1 method1];

            sleep(30);

        }

        @synchronized(obj1){

 

        

        

        }

    });

    

    //线程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(1);

        @synchronized(_myLockObj){

            [obj1 method2];

        }

    });

    

}

 
这样,就会起到锁的作用,线程2会等待线程1执行完成@synchronized(obj){}块后,在执行。从而起到锁的作用。
 
2.使用NSLock方式
 
先贴一个例子:
 
1. TestObj.h
 

@interface TestObj : NSObject

- (void)method1;

- (void)method2;

@end

 
2. TestObj.m
 

#import "TestObj.h"

 

@implementation TestObj

 

- (void)method1{

    NSLog(@"%@",NSStringFromSelector(_cmd));

    NSLog(@"Current thread = %@", [NSThread currentThread]);

    NSLog(@"Main thread = %@", [NSThread mainThread]);

}

 

- (void)method2{

    NSLog(@"%@",NSStringFromSelector(_cmd));

    NSLog(@"Current thread = %@", [NSThread currentThread]);

    NSLog(@"Main thread = %@", [NSThread mainThread]);

    

}

 

@end

 
3.在需要锁的视图控制器中,申明锁对象。
 

 TestObj *obj = [[TestObj alloc] init];

    NSLock *lock = [[NSLock alloc] init];

 

4.多线程状态下,锁操作

 

 

//线程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [lock lock];

        [obj method1];

        sleep(30);

        [lock unlock];

    });

    

    //线程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(5);//以保证让线程2的代码后执行

        [lock lock];

        [obj method2];

        [lock unlock];

    });

 
5.总结
 

使用时,基本方法就是:

[lock lock];

[obj yourMethod];

[lock unlock];

 

我们称[obj yourMethod]为“关键部分”。

NSLock的执行原理:

某个线程A调用lock方法。这样,NSLock将被上锁。可以执行“关键部分”,完成后,调用unlock方法。

如果,在线程A 调用unlock方法之前,另一个线程B调用了同一锁对象的lock方法。那么,线程B只有等待。直到线程A调用了unlock。

 

最后,还是看看API中对NSLock的一些说明

 

 

@protocol NSLocking 

 

 

lock 方法

- (void)lock

获得锁

 

unlock 方法

- (void)unlock

释放锁

 

@interface NSLock

 

lockBeforeDate: 方法

- (BOOL)lockBeforeDate:(NSDate *)limit

在指定的时间以前得到锁。YES:在指定时间之前获得了锁;NO:在指定时间之前没有获得锁。

该线程将被阻塞,直到获得了锁,或者指定时间过期。

 

tryLock 方法

- (BOOL)tryLock

视图得到一个锁。YES:成功得到锁;NO:没有得到锁。

 

setName: 方法

- (void)setName:(NSString *)newName

为锁指定一个Name

 

name 方法

- (NSString *)name

返回锁指定的Name

 

 

三、使用GCD中dispatch_semaphore_tdispatch_semaphore_wait
 

TestObj *obj = [[TestObj alloc] init];

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

    

    //线程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        [obj method1];

        sleep(10);

        dispatch_semaphore_signal(semaphore);

    });

    

    //线程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(1);

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        [obj method2];

        dispatch_semaphore_signal(semaphore);

    });

 
关于GCD中dispatch_semaphore_create和dispatch_semaphore_wait的使用

转载于:https://www.cnblogs.com/lixiong-iOS/p/3831106.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值