Object-C 多线程中锁的使用-NSLock
来源:互联网 发布:淘宝优惠券fanlibao 编辑:程序博客网 时间:2024/06/06 07:07
在多线程的编程环境中,锁的使用必不可少!
//线程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可以使用。
- Object-C 多线程中锁的使用-NSLock
- Object-C 多线程中锁的使用-NSLock
- NSLock-多线程中锁的使用
- 多线程中NSLock
- An NSLock object
- Objective c中的锁 NSLock,NSConditionLock,NSRecursiveLock
- IOS开发之NSLock 的使用
- Object C中分类的使用
- iOS 多线程同步策略之-----锁NSLock和@synchronized
- object-C中使用线程锁
- objective-c 多线程并发售票问题 NSLock 临界资源 临界区
- objective-c 多线程并发售票问题 NSLock 临界资源 临界区
- [ios]NSLock锁
- [ios]NSLock锁
- [Object-C]UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
- 在Object-C中使用@property和@synthesize的区别
- object-c多线程
- object-c多线程
- apk反编译工具-apktool
- 守护进程
- SLF4J学习笔记整理(一)—— 入门知识
- 细说PHP中strlen和mb_strlen的区别
- 基于注解的Spring MVC+Hiberntae简单入门【转】
- Object-C 多线程中锁的使用-NSLock
- json解析器
- Silverlight 图片路径问题
- 文件夹删除 文件夹复制
- 使用js导入excel和ajax传送数据回数据库保存的代码
- setEndPoint
- 黑马程序员------javascript与正则表达式
- HBASE SHELL 常用命令
- Maven配置