MST

星途 面试题库

面试题:Objective-C 基本数据类型与变量声明:原子性与线程安全

考虑一个多线程环境下,在Objective-C中声明一个`NSMutableArray`类型的变量`mutableArray`。如果多个线程同时对`mutableArray`进行添加和删除操作,会出现什么问题?如何通过对变量声明以及使用适当的锁机制或原子操作来确保线程安全?请详细阐述实现思路,并给出关键代码示例。
26.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

问题分析

在多线程环境下,多个线程同时对NSMutableArray进行添加和删除操作,可能会导致数据竞争问题。例如,一个线程正在添加元素时,另一个线程同时进行删除操作,这可能会导致数组内部状态不一致,引发程序崩溃或数据丢失等问题。

实现思路

  1. 使用锁机制:可以使用NSLockNSRecursiveLockdispatch_semaphore等锁来保证同一时间只有一个线程能够访问和修改mutableArray
  2. 原子操作:虽然NSMutableArray本身不是线程安全的,但可以通过将其封装在一个线程安全的类中,利用原子属性来保证部分操作的原子性,但对于复杂的添加和删除操作,锁机制更可靠。

关键代码示例

  1. 使用NSLock
#import <Foundation/Foundation.h>

@interface ThreadSafeArray : NSObject

@property (nonatomic, strong) NSMutableArray *mutableArray;
@property (nonatomic, strong) NSLock *arrayLock;

- (void)addObject:(id)object;
- (void)removeObject:(id)object;

@end

@implementation ThreadSafeArray

- (instancetype)init {
    self = [super init];
    if (self) {
        _mutableArray = [NSMutableArray array];
        _arrayLock = [[NSLock alloc] init];
    }
    return self;
}

- (void)addObject:(id)object {
    [self.arrayLock lock];
    [self.mutableArray addObject:object];
    [self.arrayLock unlock];
}

- (void)removeObject:(id)object {
    [self.arrayLock lock];
    [self.mutableArray removeObject:object];
    [self.arrayLock unlock];
}

@end
  1. 使用dispatch_semaphore
#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>

@interface ThreadSafeArray : NSObject

@property (nonatomic, strong) NSMutableArray *mutableArray;
@property (nonatomic, assign) dispatch_semaphore_t semaphore;

- (void)addObject:(id)object;
- (void)removeObject:(id)object;

@end

@implementation ThreadSafeArray

- (instancetype)init {
    self = [super init];
    if (self) {
        _mutableArray = [NSMutableArray array];
        _semaphore = dispatch_semaphore_create(1);
    }
    return self;
}

- (void)addObject:(id)object {
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    [self.mutableArray addObject:object];
    dispatch_semaphore_signal(self.semaphore);
}

- (void)removeObject:(id)object {
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    [self.mutableArray removeObject:object];
    dispatch_semaphore_signal(self.semaphore);
}

@end

在上述代码中,ThreadSafeArray类封装了NSMutableArray,并通过锁机制(NSLockdispatch_semaphore)来确保对mutableArray的添加和删除操作在多线程环境下的线程安全性。在使用时,创建ThreadSafeArray的实例,然后通过调用其addObject:removeObject:方法来进行线程安全的操作。