//線程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];
}
});
}
@interface TestObj : NSObject
- (void)method1;
- (void)method2;
@end
#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
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];
});
使用時,基本方法就是:
[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
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);
});
------------------------------------------
除此之外,還有NSCondition可以使用。