IOS多线程--锁

NSLock  

(0)为什么上锁

1.atomic(原子操作)是指不会被线程机制打断,这种操作一旦开始就运行到结束,中间不会有任何的切换

    2.我们可以通过(NSLock)使这段代码成为原子操作

    3.使用线程锁,不是服务于线程,而是服务于代码,如果我们想对一段代码进行原子从操作的时候(数据库的写入)就可以加锁

    4.@synchronized(互斥锁)也能实现原子操作,但是关键字不能在一个函数中加锁,然后在另一个函数中解锁,lock就能实现

(1)创建(线程锁,多个线程有一把锁就够了,谁锁谁打开)

if (_threadLock == nil) {

        _threadLock = [[NSLock alloc]init];

    }

(2)上锁(当有多个线程执行一个方法的时候、上锁后、只允许这个线程执行这个方法)

    [_threadLock lock];

(3)解锁(执行完毕后解锁、下一个线程在接着执行这个方法)

[_threadLock unlock];

(4)互斥锁、在共享资源的“读”“写”范围内加、一般都用self锁

锁是比较耗资源的、要让锁的范围尽量的小、使用锁对内存消耗比较昂贵

@synchronized(self) 

NSCondition  线程锁

实例一、1个生产者,对应多个消费者

    1.创建一个实例

    2.如果是消费者,取得锁,然后去取产品,如果没有则wait,这时候就会释放锁,进入加锁代码,直到有线程唤醒它去消耗产品,然后解锁

    3.如果是制作者,首先也是取得锁,然后生产,再发signal,这样做会唤醒wait的消费者

(1)生产者、取锁

[self.condition lock];

//1.生产

//2.唤醒一个等待中的线程,随机的

[self.condition signal];

  此方法能够唤醒所有等待的线程

[self.condition broadcast];

[self.condition unlock];

(2)消费者、取锁

[self.condition lock];

//1.判断、如果没有产品、依次进入等待

    (condition一旦调用了wait,其他线程可以进入加锁代码(说明一下,这里是和之前的lock,sync同步关键字不同的地,因为lock是不能进入 加锁代码的)) [self.condition wait];

//2.当被唤醒的时候、消费产品

[self.condition unlock];

原文地址:https://www.cnblogs.com/gaduo/p/4996556.html