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];