美文网首页
ios中常用的锁

ios中常用的锁

作者: 就是lpc | 来源:发表于2018-04-02 14:51 被阅读0次

ios中常用的锁

为什么要用到锁?锁是什么

在平时的开发过程中,为了提升我们应用程序的运行效率,性能,我们会经常使用到多线程,在使用多线程的过程中,我们可能会遇到不同线程抢夺资源的问题,这个就涉及到一个线程安全的问题。

什么是线程安全

那么是线程安全呢?其实非常好理解,当一个线程访问一个数据的时候,其他的线程不能对他访问,知道线程访问结束为止。如果同一时刻,允许其他进程访问一个数据的时候,我们称之为线程不安全

锁诞生了

为了线程安全,能保证同一时刻只有同一个线程来对同一个数据源进行访问,这就是

ios日常开发中最常见的锁

@synchronized

互斥锁,平时经常看到的一中写法,这个锁的性能其实是比较差的,但是代码量比较少,使用简单。

@synchronized () { }

dispatch_queue_t que = dispatch_queue_create("测试队列1",DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(que, ^{
        @synchronized (self) {
            sleep(2);
            NSLog(@"任务1");
        }

    });
    
    dispatch_async(que, ^{
        @synchronized (self) {
            NSLog(@"任务2");
        }
    });

NSLock

互斥锁。苹果提供的最简单的锁。使用方式也非常简单。但是连续锁了两次会造成死锁。
性能是优于@synchronized

  NSLock *lock = [[NSLock alloc]init];
    dispatch_async(que, ^{
        [lock lock];
        sleep(3);
        NSLog(@"任务1");
        [lock unlock];
    });

    dispatch_async(que, ^{
        [lock lock];
        NSLog(@"任务2");
        [lock unlock];
    });

如果我们需要在递归的时候重复调用锁怎么办这个时候我们可以用NSRecursiveLock

NSRecursiveLock

递归锁,可以在同一线程多次lock

 NSLock *lock = [[NSLock alloc]init];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        static void(^testMethod)(int);
        testMethod = ^(int value){
            [lock lock];
            [NSThread sleepForTimeInterval:1];
            NSLog(@"%@",[NSThread currentThread]);
            if (value > 0) {
                NSLog(@"----%d", value);
                testMethod(value - 1);
            }
            [lock unlock];
        };
        testMethod(4);
    });
 

这段代码第一次进来的时候没有unlock 当第二次进来的时候,则会造成死锁。非常常见,但经常被忽略的错误。这个时候我们就要用NSRecursiveLock

 NSRecursiveLock *lock = [[NSRecursiveLock alloc]init];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        static void(^testMethod)(int);
        testMethod = ^(int value){
            [lock lock];
            [NSThread sleepForTimeInterval:1];
            NSLog(@"%@",[NSThread currentThread]);
            if (value > 0) {
                NSLog(@"----%d", value);
                testMethod(value - 1);
            }
            [lock unlock];
        };
        testMethod(4);
    });
 

NSConditionLock

条件锁,也是继承NSLocking协议,比nslock多了个条件参数condition

    NSConditionLock *lock = [[NSConditionLock alloc]initWithCondition:0];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [lock lockWhenCondition:0];
        sleep(2);
        NSLog(@"任务1");
        [lock unlockWithCondition:3];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [lock lockWhenCondition:15];
        sleep(2);
        NSLog(@"任务2");
        [lock unlockWithCondition:16];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [lock lockWhenCondition:3];
        sleep(5);
        NSLog(@"任务3");
        [lock unlockWithCondition:15];
    });
    

总结

掌握前面几个简单的锁,基本可以对付日常的开发需求咯。当然还有其他OSSpinLockdispatch_semaphore等等,建议还是用苹果爸爸的api,简单,好用,性能也不算太差。有什么意见错误,欢迎指正。

相关文章

  • iOS 中常见的几种锁介绍-示例

    常用的各类锁性能比较 文中Demo 均实现在 XWInterviewDemos 1. iOS中的互斥锁 在编程中,...

  • iOS中的锁笔记

    本文只是我对iOS中锁的学习笔记,没有太深入的研究讲解。先来一张ios中常用锁的性能对照图 锁的分类 自旋锁:在未...

  • iOS-锁

    iOS开发中知道的哪些锁? 哪个性能最差? 锁是线程编程同步工具的基础。iOS开发中常用的锁有如下几种: @syn...

  • iOS开发中常用的锁

    锁是线程编程同步工具的基础,在iOS开发中常用的锁有以下几种: @synchronized NSLock 对象锁 ...

  • ios中常用的锁

    ios中常用的锁 为什么要用到锁?锁是什么 在平时的开发过程中,为了提升我们应用程序的运行效率,性能,我们会经常使...

  • 线程锁

    谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? ⼀般开发中你最常用哪个? 哪个锁apple...

  • 好文章

    编写第一个 LLDB 脚本常用的设计模式有哪些iOS动画暂停与恢复的理解Swift 5.3 新特性iOS中的锁文章...

  • iOS 常用锁

    信号量dispatch_semaphore 【塞莫佛】 在多线程环境下用来确保代码不会被并发调用。在进入一段代码前...

  • iOS 中几种常用的锁总结

    多线程编程中,应该尽量避免资源在线程之间共享,以减少线程间的相互作用。 但是总是有多个线程相互干扰的情况(如多...

  • 1、谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使

    1、谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? 一般开发中你最常用哪个? 哪个锁app...

网友评论

      本文标题:ios中常用的锁

      本文链接:https://www.haomeiwen.com/subject/latxhftx.html