Objective-C中不同方式实现锁
来源:互联网 发布:仟佰盾口罩 淘宝多少钱 编辑:程序博客网 时间:2024/05/21 08:41
为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生。
实现锁的方法有四种。
1.使用NSLock
TestObj *obj = [[TestObj alloc] init];NSLock *lock = [[NSLock alloc] init];//线程1dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [lock lock]; [obj method1]; sleep(10); [lock unlock];});//线程2dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1);//以保证让线程2的代码后执行 [lock lock]; [obj method2]; [lock unlock];});
线程1锁住之后,线程2会一直等待走到线程1将锁置为unlock后,才会执行method2方法。
NSLock是Cocoa提供给我们最基本的锁对象,这也是我们经常所使用的,除lock和unlock方法外,NSLock还提供了tryLock和lockBeforeDate:两个方法,前一个方法会尝试加锁,如果锁不可用(已经被锁住),刚并不会阻塞线程,并返回NO。lockBeforeDate:方法会在所指定Date之前尝试加锁,如果在指定时间之前都不能加锁,则返回NO。
2.使用synchronized关键字构建的锁
//主线程中TestObj *obj = [[TestObj alloc] init];//线程1dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized(obj){ [obj method1]; sleep(10); }});//线程2dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1); @synchronized(obj){ [obj method2]; }});
@synchronized指令使用的obj为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2中的@synchronized(obj)改为@synchronized(other),刚线程2就不会被阻塞,@synchronized指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制,但作为一种预防措施,@synchronized块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。
3.使用C语言的pthread_mutex_t实现的锁
//主线程中TestObj *obj = [[TestObj alloc] init];__block pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);//线程1dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ pthread_mutex_lock(&mutex); [obj method1]; sleep(5); pthread_mutex_unlock(&mutex);});//线程2dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1); pthread_mutex_lock(&mutex); [obj method2]; pthread_mutex_unlock(&mutex);});
pthread_mutex_t定义在pthread.h,所以记得#include
4.使用GCD来实现的“锁”
GCD中已经提供了一种信号机制,使用它我们也可以来构建一把“锁”(从本质意义上讲,信号量与锁是有区别,具体差异参加信号量与互斥锁之间的区别):
//主线程中TestObj *obj = [[TestObj alloc] init];dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);//线程1dispatch_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);});//线程2dispatch_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);});
1 0
- Objective-C中不同方式实现锁
- Objective-C中不同方式实现锁
- Objective-C中不同方式实现锁
- Objective-C中不同方式实现锁(一)
- Objective-C中不同方式实现锁(一)
- Objective-C中不同方式实现锁(二)
- Objective-C中不同方式实现锁(一)
- Objective-C中不同方式实现锁(二)
- Objective-C中不同方式实现锁(一)
- Objective-C中不同方式实现锁(一)
- Objective-C中不同方式实现锁(二)
- Objective-C中不同方式实现锁(二)(…
- objective-c中 -(void)和+(void)有什么不同
- objective-c中不同数据类型之间的相互转换
- Objective-C锁的实现
- Objective C 中实现单例模式
- Objective-C中trim的实现
- Objective-C中实现变长参数问题
- 探索C++0x: 1. 静态断言(static_assert)
- 配置DirectShow开发环境(VS2010,64位Win8系统)
- nova list命令的代码流程分析
- Java基础之十二:网络编程
- Hadoop Streaming编程实例
- Objective-C中不同方式实现锁
- 利用Hadoop Streaming处理二进制格式文件
- Java基础之十三:Java集合框架
- linux 工作队列workqueue
- iOS中头条新闻滑动效果
- Blackjack - Intro
- Java基础之十五:JDBC基础
- Linux笔记(61)——mysql源码包安装
- 简单的基于Socket的TCP编程实例