iOS锁

作者: 楼上那只猫 | 来源:发表于2020-06-11 21:46 被阅读0次

锁的作用:保证线程安全。
锁的分类:互斥锁自旋锁,其它比如条件锁,递归锁,信号量都是上层的封装和实现。

互斥锁

防止两条线程同时同一公共资源进行读写的机制。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

互斥锁分为:

  • 递归锁:可重入锁,同一个线程在锁释放前可再次获取锁,可以递归调用
  • 非递归锁:不可重入,必须等锁释放后才能再次获取锁。

自旋锁

线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取自旋锁,线程会一直保持该锁,直到显式释放。
优点:避免了线程的上下文调度开销,因此对于线程只会阻塞很短时间的场景很有用。

互斥锁和自旋锁区别

  • 互斥锁在线程没获取到锁时,线程会进入休眠状态,等锁被释放时会被唤醒
  • 自旋锁的线程会一直处于等待(忙等待),不会进入休眠,效率高。

自旋锁种类

1. OSSpinLock

自旋锁存在不安全机制,因为自旋锁会让线程处于忙等待,因此高优先级的线程可能一直占用CPU,造成低优先级的任务无法执行,不能释放锁。

2. 读写锁

  • 写是排他的,同时只能有一个写或者多个读,但不能同时读写。
  • 若当前没有读写,写可以立即获得读写锁,否则必须等待没有任何读写者。如果没有写,读可以立即获得锁,否则不谢等写释放锁。

互斥锁

pthread_mutex

全局声明
#import <pthread.h>

pthread_mutex_t _lock;
- (void)addCount {
    pthread_mutex_lock(&_lock);
    for (int i = 0; i < 10; i++) {
        self.count += 1;
        NSLog(@"----- %d", self.count);
    }
    pthread_mutex_unlock(&_lock);
}

- (void)method1 {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self addCount];
    });
}

- (void)method2 {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self addCount];
    });
}

@synchronized

@synchronized (self) {
        for (int i = 0; i < 10; i++) {
            self.count += 1;
            NSLog(@"----- %d", self.count);
        }
    }
  1. 不能使用非OC对象作为加锁条件——id2data中接收参数为id类型
  2. 多次锁同一个对象会有什么后果吗——会从高速缓存中拿到data,所以只会锁一次对象
  3. 都说@synchronized性能低——是因为在底层增删改查消耗了大量性能
  4. 加锁对象不能为nil,否则加锁无效,不能保证线程安全

NSLock

是对互斥锁的简单封装

    [self.lock lock];
    //[self.lock lock] 重复两次会造成线程永久锁死
    for (int i = 0; i < 10; i++) {
        self.count += 1;
        NSLog(@"----- %d", self.count);
    }
    [self.lock unlock];

NSLock在解锁前不能重复加锁。

NSRecursiveLock

可重复加锁

dispatch_semaphore

NSCondition

NSConditionLock

性能对比


性能对比.png

参考:https://juejin.im/post/5ec9f3ec6fb9a047f0125fd2#heading-32

相关文章

  • iOS锁系列-目录

    1、 iOS锁系列-NSLock对象锁2、iOS锁系列-NSConditionLock条件锁3、iOS锁系列-NS...

  • 起底多线程同步锁(iOS)

    起底多线程同步锁(iOS) 起底多线程同步锁(iOS)

  • iOS 中常见的几种锁-代码示例

    iOS 中常见的几种锁-代码示例 iOS 中常见的几种锁-代码示例

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

  • 多线程 (三)iOS中的锁

    ios 多线程--锁

  • iOS 锁

    iOS Lock(锁) 主要介绍常见的锁,以及synchronized、NSLock、递归锁、条件锁的底层分析 借...

  • iOS-锁

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

  • iOS中的锁笔记

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

  • iOS和Android代码中实现禁止手机休眠

    (一)iOS平台默认,所有iOS设备在过了设定的休眠时间后,都会自动锁屏。如果你的应用不希望iOS设备自动锁屏,需...

  • iOS的线程安全与锁

    iOS的线程安全与锁

网友评论

      本文标题:iOS锁

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