OC中的synchronized和dispatch_semaphore_t

synchronized

synchronized是对p_thread_mutex的封装,也能对线程进行加锁,从而实现线程同步。
看代码:

  [[[NSThread alloc] initWithTarget:self selector:@selector(thread1) object:nil] start];
[[[NSThread alloc] initWithTarget:self selector:@selector(thread2) object:nil] start];

  - (void)thread1{
@synchronized (self) {
    NSLog(@"%s", __func__);
}
}

  - (void)thread2{
@synchronized (self) {
    NSLog(@"%s", __func__);
}
}

最后能保证thread1方法在thread2方法之前执行。一个对象对应一把锁。synchronized使用起来相对方便,但由于它封装的较多,所以性能并不是很好。

为什么要获取某个对象?
传入nil不起作用。
传入的object的内存地址作为key,通过hash map对应的一个系统维护的递归锁。
传入self容易导致死锁。

//class A
@synchronized (self) {
    [_sharedLock lock];
    NSLog(@"code in class A");
    [_sharedLock unlock];
}

//class B
[_sharedLock lock];
@synchronized (objectA) {
    NSLog(@"code in class B");
}
[_sharedLock unlock];

如上面代码所示,self被用作key生成同一把锁,两个公共锁交替使用容易出现死锁,正确的做法是传入一个类内部维护的NSObject对象,而且这个对象是外部不可见的。(引用自该篇文章:https://www.jianshu.com/p/2dc347464188)

dispatch_semaphore_t

dispatch_semaphore_t也能实现线程同步。
看代码:

  - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (NSInteger i = 0; i < 10; i ++) {
    dispatch_async(queue, ^{
        [self test];
    });
}

}

- (void)test{

dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"begin。。。");
sleep(3);
NSLog(@"test:%@", [NSThread currentThread]);
dispatch_semaphore_signal(self.semaphore);
}

在创建semaphore的时候,初始参数为1就能保证线程的同步。其中的参数是指线程最大并发数。那么我们也就可以利用GCD中的semaphore设置线程的最大并发数了。

这里还有semaphore异步变同步的用法
iOS开发中GCD的一些用法

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ​ 前言:这可能是史上最全面的一篇iOS 多线程博客了(王婆卖瓜一番😄),从多线程的基本概念,进程的概念,引出i...
    阿饼six阅读 889评论 2赞 11
  • 锁是一种同步机制,用于多线程环境中对资源访问的限制iOS中常见锁的性能对比图(摘自:ibireme): iOS锁的...
    LiLS阅读 1,681评论 0赞 6
  • 本文为转载资料,原文地址: http://www.jianshu.com/p/02821f9d7777 一、信号量...
    一曰就是一天阅读 1,323评论 0赞 3
  • R2这几天可把我们大家吓坏了,来到家第一天除了整晚叫唤,其他一切都好,早上我特意早早起来喂食,结果他吃了一会儿就全...
    陪小天慢慢长大阅读 206评论 0赞 0
  • 古往今来,乐于助人的人都被贴上“好人”的标签,对于那些乐于助人的人,我们都会认为他是好人。然而,如今社会,这已经不...
    木子铅华阅读 350评论 0赞 0

友情链接更多精彩内容