iOS中线程同步基本详解

时间:2023-03-09 05:00:02
iOS中线程同步基本详解

为什么使用线程同步技术:多个线程是同时执行的 如果多个线程同时操作一个资源 会造成此资源的数据错乱

线程同步简介

线程同步,多条线程按顺序地访问某个资源

注意:此处的同步不是一起执行的意思 是一个一个按照顺序执行 一个执行完了 另一个才能执行

场景

当多个线程同时访问一个资源的时候 会造成该资源的混乱 此时应使用线程同步

资源:Toilet男女共用

线程:peopleA、peopleB(女)、peopleC

互斥锁,就是线程同步技术的体现

场景: 两个售票员售票

两个线程 名字分别是 售票员A、售票员B

同样的工作卖票:

1、先获取票数 int count = self.ticketsCount

2、判断票是否卖完了 if(count>0)

3、暂停一会分线程  0.002 (保证两个都获取到了总票数 模拟理论上的情况)

4、票数等于检查票数减一  self.ticketsCount = count-1

5、获取当前线程

6、打印当前线程、以及剩余票数

iOS应用程序中支持多任务。这意味着可能有两个线程同时试图修改同一个对象。有一个办法可以解决这个情况。为了防止多个线程同时执行同一个代码块,OC提供了@synchronized()指令。

使用@synchronized()指令可以锁住在线程中执行的某一个代码块。使用代码块的其他线程,将被阻塞,这也就意味着,他们将在@synchronized()代码块的最后一条语句执行结束后才能继续执行。

一般在操作公用资源的时候使用,如单例模式或者操作类的static变量中使用。

@synchronized(对象A){需要线程同步的代码}

对象A是一个用来区别保护块的唯一标识符 其实就是相当于一把锁

如下所示 如果不同线程传递不同的对象 那么将不会起到线程同步的作用

通常都在此处传self @“123” @“456” id 任意对象类型 等价于 NSObject *

反例

- (void)myMethod:(id)anyObject

{

      @synchronized(anyObject){

      }

}

互斥锁的优缺点 NSLock

优点:能有效防止因多线程抢夺资源造成的数据安全问题

缺点:需要消耗大量的CPU资源

补充知识:

OC在定义属性时有nonatomic和atomic两种选择

atomic:默认的property关键字,原子属性,为set方法加锁 线程安全(默认就是atomic)

nonatomic:非原子属性,不会为setter方法加锁 非线程安全

atomic加锁原理

@property (assign) int age;

- (void)setAge:(int)age

{

@synchronized(self) {

_age = age;

}

}

自动释放池  NSAutoreleasePool

当你向对象发送一个autorelease消息 该对象会被标记 进入自动释放池 当自动释放池释放时会调用release或drain方法先销毁池中的对象 然后销毁自己

推荐:drain

使用场景:

a、线程中使用自动释放池来包裹代码

b、局部产生大量autorelease对象 比如线程中的循环中

1、NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

[pool release] 或者 [pool drain]

上面两者没有本质的区别 在GC环境下release无效 建议drain

2、@autorelease{

}