MST

星途 面试题库

面试题:Objective-C中如何确保可变对象在线程环境下的安全操作

在Objective-C编程中,当多个线程同时操作一个可变对象(如NSMutableArray)时,可能会引发数据竞争问题。请描述至少两种确保该可变对象在线程环境下安全操作的方法,并给出简单代码示例。
39.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用互斥锁(NSLock)
    • 原理:互斥锁用于保证在同一时间只有一个线程能够访问被保护的代码块,从而避免数据竞争。
    • 代码示例
NSMutableArray *mutableArray = [NSMutableArray array];
NSLock *lock = [[NSLock alloc] init];

dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue1, ^{
    [lock lock];
    [mutableArray addObject:@"Object from queue1"];
    [lock unlock];
});

dispatch_async(queue2, ^{
    [lock lock];
    [mutableArray addObject:@"Object from queue2"];
    [lock unlock];
});
  1. 使用@synchronized关键字
    • 原理@synchronized 块会自动创建一个互斥锁,确保在同一时间只有一个线程能够进入该块,从而保证线程安全。
    • 代码示例
NSMutableArray *mutableArray = [NSMutableArray array];

dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue1, ^{
    @synchronized(mutableArray) {
        [mutableArray addObject:@"Object from queue1"];
    }
});

dispatch_async(queue2, ^{
    @synchronized(mutableArray) {
        [mutableArray addObject:@"Object from queue2"];
    }
});
  1. 使用GCD的串行队列
    • 原理:将对可变对象的操作放在一个串行队列中执行,由于串行队列一次只能执行一个任务,所以能保证数据的一致性。
    • 代码示例
NSMutableArray *mutableArray = [NSMutableArray array];
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue1, ^{
    dispatch_async(serialQueue, ^{
        [mutableArray addObject:@"Object from queue1"];
    });
});

dispatch_async(queue2, ^{
    dispatch_async(serialQueue, ^{
        [mutableArray addObject:@"Object from queue2"];
    });
});