在多线程开发中,要注意避免的是多个线程在同一时间对某数据进行读或写所造成的不可预见错误。因此在不同线程中需要对公共数据进行互斥的访问,最常见的是生产者与消费者问题。
1. 同步块或者NSLock
同步块或者NSLock实现的效果差不多,都是进行加锁-操作-解锁,以此达到互斥访问的效果。
在一个代码块中进行加锁可以实现不同线程对该代码块的互斥访问。在多个代码块中使用同一个信号量进行加锁则不同代码块之间也能实现互斥访问。即加锁解锁的本质是对信号量的原子处理。
//生产者-同步代码块,括号参数为自定义信号量
-(void)synchronizeFunc1 {
@synchronized (self) {
if(count < 1000) {
count += 100;
NSLog(@"P count is %d", count);
}
}
}
//消费者-同步代码块
-(void)synchronizeFunc2 {
@synchronized (self) {
if(count > 0) {
count -= 100;
NSLog(@"C count is %d", count);
}
}
}
//生产者-NSLock,一个NSLock对象就是一个信号量
-(void)synchronizeFunc3 {
[nsLock lock];
if(count < 1000) {
count += 100;
NSLog(@"P count is %d", count);
}
[nsLock u