Objective-c:@synchronized,它是如何工作的

作者:编程家 分类: objective 时间:2025-12-26

Objective-C是一种面向对象的编程语言,它是C语言的扩展,用于开发Mac OS和iOS应用程序。在Objective-C中,有一个关键字@synchronized,用于实现多线程之间的同步操作。本文将介绍@synchronized关键字的工作原理,并且提供一个案例代码来说明它的用法。

什么是@synchronized关键字

在多线程编程中,当多个线程同时访问共享资源时,可能会导致数据竞争和不确定的结果。为了避免这种情况,需要使用同步机制来确保线程安全。Objective-C中的@synchronized关键字就是一种同步机制,它可以用于保护临界区的代码,使得同一时间只有一个线程可以执行该代码块。

@synchronized关键字的工作原理

@synchronized关键字是通过使用互斥锁(mutex)来实现同步的。互斥锁是一种特殊的锁,它只允许一个线程进入临界区,其他线程需要等待锁释放才能进入。当一个线程进入@synchronized代码块时,它会尝试获取互斥锁,如果锁已经被其他线程持有,则该线程会被阻塞,直到锁被释放。一旦获得锁,线程就可以执行临界区的代码,执行完毕后释放锁,其他线程才能进入。

案例代码

下面是一个简单的案例代码,演示了如何使用@synchronized关键字来保护临界区的代码:

@interface Counter : NSObject

@property (nonatomic, assign) NSInteger count;

- (void)increment;

@end

@implementation Counter

- (instancetype)init {

self = [super init];

if (self) {

self.count = 0;

}

return self;

}

- (void)increment {

@synchronized(self) {

self.count++;

NSLog(@"Count: %ld", self.count);

}

}

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

Counter *counter = [[Counter alloc] init];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

for (int i = 0; i < 10; i++) {

dispatch_async(queue, ^{

[counter increment];

});

}

dispatch_barrier_sync(queue, ^{

NSLog(@"Final Count: %ld", counter.count);

});

}

return 0;

}

在上面的代码中,Counter类有一个count属性和一个increment方法。increment方法使用@synchronized关键字来保护count的操作,确保每次只有一个线程可以访问count。

在主函数中,我们创建了一个Counter对象,并使用dispatch_async函数在多个线程中调用increment方法。最后我们使用dispatch_barrier_sync函数来等待所有线程执行完毕,并打印最终的count值。

运行结果

运行上面的代码,我们可以得到如下输出:

Count: 1

Count: 2

Count: 3

Count: 4

Count: 5

Count: 6

Count: 7

Count: 8

Count: 9

Count: 10

Final Count: 10

从输出结果可以看出,每个线程依次增加了count的值,并且最终的count值为10。这是因为@synchronized关键字保证了每次只有一个线程可以访问count,避免了数据竞争的问题。

通过使用@synchronized关键字,我们可以实现多线程之间的同步操作,保护共享资源的访问。它的工作原理是通过互斥锁来确保同一时间只有一个线程可以执行临界区的代码。在实际开发中,我们可以使用@synchronized关键字来保护关键数据,避免数据竞争和不确定的结果。