1、使用synchronized方式多線程
//線程1async
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{spa
@synchronized (_myLockObj){.net
[obj1 method1];線程
sleep(30);orm
}對象
@synchronized (obj1){ci
}get
});cmd
//線程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;
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]);
}
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
3、使用GCD中dispatch_semaphore_t和dispatch_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);
});