线程锁

作者: 羽裳有涯 | 来源:发表于2019-02-12 11:29 被阅读6次

前言

所谓锁,就是在操作数据的时候,为了防止多个操作同时操作一个数据导致数据的错乱或者非即时而采用的一种规避手段。

尤其在使用多线程进行开发时,由于多个线程的操作可能会同时对某个数据进行操作,可能是读也可能是写,如果不加以处理,那么可能在一个线程读的时候另一个线程去写,读的线程得到的数据就可能不是最新的数据,或者两个线程同时对数据进行修改,导致一些不可预知的错乱。

这时候就应该加一道锁,在A线程操作数据的时候,将数据给锁住,锁住的意思也就是不允许其他线程来操作这个数据,想操作的都得进行等待,直到 A操作完了,才将锁给打开,这时才允许其他线程排队进行操作。

说到锁,还有个概念不得不说,那就是信号量,信号量是用来控制加锁解锁的,比如说一个变量,为0表示当前无人操作,为1表示当前有人操作,那么当一个线程要操作时,先看这个信号量是不是0,是0就可以操作, 是1就得等待,这事一种信号量的形式,还有多种形式。

加锁机制是支持递归的,如果加锁的代码在当前线程中递归调用自身,那么会持续保持加锁状态,其余线程还是访问不了,只有当递归完成全部执行完后,或者出错报异常退出后,锁才会解开,释放信号量,其余线程才允许操作此段代码块。

在iOS开发中多线程也是经常用到的东西,因此对于一些关键的代码就有必要加锁。iOS 中加锁有多种方式,比如:

  • NSLock
  • dispatch_semaphore_wait
  • @synchronized

@synchronized

@synchronized()小括号内需要一个参数,这个参数就表示信号量。这个参数可以是任何对象,包括 self,或者是自定义的信号量。针对不同的操作应该定义不同的信号量。

@synchronized() {…}大括号中就是要加锁执行的代码,代码会操作一些数据。当开始执行代码时,意味着当前线程对其加锁了,当代码执行完后,自动解锁,其他线程才允许执行此段代码。

下面是用 self 作为信号量来加锁的示例,也就是在当前实例中对此代码块操作要加锁:

-(void)importantMethod  
{  
    @synchronized(self)  {  
        // 关键代码;  
    }  
    @synchronized(_cache) {
            [_cache removeAllObjects];
      }
}  

下面是使用自定义的信号量来加锁的示例:

-(void)importantMethod {
    Account *account = [AccountaccoutFromString :[accountFiled stringValue]];
    //获取信号量
    id accountSemaphore = [account semaphore];
    @synchronized(accountSemaphore) {
        //关键代码
    }
}

NSLock

比较常用的一种锁,性能一般

dispatch_semaphore_t

GCD之dispatch_semaphore

相关文章

  • 4.0.6.守护线程,线程死锁

    守护线程会随着主线程的结束而结束DaemonThread 线程 1, 线程 2,锁1,锁2 线程1 有锁1,想拿锁...

  • 悲观锁:一个线程得到锁,其它线程挂起,synchronized 乐观锁:一个线程得到锁,其它线程不断重试, cas...

  • sleep,wait, join yield

    锁池:所有需要竞争同步锁的线程都会放在锁池中,当一个线程得到锁后,其他线程都会在锁池中等待,当线程释放锁之后,其他...

  • 并发编程-线程

    线程 GIL 守护线程 线程锁(互斥锁 and 递归锁) 信号量 事件 条件 定时器 1.线程: 特点在多线程的操...

  • 深入理解AQS(二)- 共享模式

    共享锁与独占锁 独占锁被某个线程持有时,其他线程只能等待当前线程释放后才能去竞争锁,而且只有一个线程能竞争锁成功。...

  • iOS中各种锁的性能对比

    自旋锁 与 互斥锁 自旋锁 (spin lock): 如果一个线程需要获取自旋锁,该锁已经被其他线程占用,该线程不...

  • 死锁

    什么是死锁 简单的说:线程1持有A锁,线程2持有B锁;线程1尝试获取B锁,线程2尝试获取A锁。两个线程各持有了一把...

  • 公平锁和非公平锁-ReentrantLock是如何实现公平、非公

    1、什么是公平锁与非公平锁 公平锁:公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁。非公平锁:非...

  • 2020-03-11 公平锁与非公平锁

    补: 公平锁:多个线程情况下排队,先到先获得锁 非公平锁:当锁被释放后,所有线程竞争锁,抢到的线程就会获得锁 非公...

  • LINUX线程

    创建线程 启动线程 线程锁

网友评论

      本文标题:线程锁

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