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

http://blog.sina.com.cn/s/blog_7b9d64af0101d77e.html

  1. TestObj.h
@interface TestObj : NSObject

- (void)method1;

- (void)method2;

@end

  1. 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。

你可能感兴趣的:(Object-C 多线程中锁的使用-NSLock)