ViewController.m 中解决资源抢夺问题
如何在 iOS 中避免多线程竞争问题
创建时间:15/12/25
版权所有 © 2015 DC017. All rights reserved.
在 iOS 开发中,多线程编程是非常常见的,但也伴随着资源抢夺等问题。本文将详细介绍如何在 ViewController.m 中使用 NSLock 和 @synchronized 来解决这些问题。
首先,我们需要明确属性读取和修改的原子性。属性如果没有正确保护,可能会导致线程安全问题。例如,属性如果是非原子性的,读取时可能会读取到修改前的数据,这在多线程环境中是非常危险的。
为了保证线程安全,我们需要使用 NSLock 或 @synchronized 来保护关键代码段。NSLock 是一种互斥锁,它可以确保在同一时间只有一个线程能够访问受保护的代码段。@synchronized 是一种更简便的方式,自动为属性创建互斥锁。
在 ViewController.m 中,我们可以通过以下方式实现资源抢夺的解决方案:
首先,我们需要在头文件中声明所需的属性。例如:
@property (atomic, strong) NSMutableArray *muarray;
然后,在 viewDidLoad 方法中初始化这个数组:
_muarray = [[NSMutableArray alloc] init];
接着,我们可以在需要修改数组的代码段前后使用 NSLock 来保护。
例如,在 buyTicket 方法中,我们可以这样做:
void buyTicket:(int)buyer{
[lock lock]; // 获取锁
if (_muarray.count > 0) {
NSLog(@"%d号顾客买到了票:%@",buyer,[_muarray lastObject]);
[_muarray removeLastObject];