当前位置: 首页 > news >正文

@synchronized的使用

@synchronized 介绍

@synchronized 是 Objective-C 提供的一种 互斥锁(Mutex),它用于确保一段代码在同一时间只有一个线程能执行,避免多线程访问共享资源时出现数据竞争

基本语法

@synchronized (lockObject) {// 需要加锁的代码
}
  • lockObject 是锁的标识,不同的对象代表不同的锁。
  • 如果多个线程使用相同的 lockObject,则 @synchronized 会保证同一时间只有一个线程能执行代码块。
  • 如果 lockObject 为空 (nil),不会起到任何加锁效果,代码块仍然会并发执行。

@synchronized 使用场景

1. 保护共享资源

如果多个线程同时修改同一个对象,可能会出现数据竞争问题。例如:

#import <Foundation/Foundation.h>@interface MyClass : NSObject
@property (nonatomic, assign) NSInteger count;
@end@implementation MyClass- (void)incrementCount {@synchronized(self) {self.count = self.count + 1;}
}@endint main(int argc, const char * argv[]) {@autoreleasepool {MyClass *myObject = [[MyClass alloc] init];dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);// 创建多个线程同时调用 incrementCount 方法for (int i = 0; i < 1000; i++) {dispatch_async(concurrentQueue, ^{[myObject incrementCount];});}// 等待所有任务完成dispatch_barrier_sync(concurrentQueue, ^{NSLog(@"Final count: %ld", (long)myObject.count);});}return 0;
}

多次执行结果

Final count: 1000

Final count: 1000

Final count: 1000

如果去掉@synchronized,你会发现结果大多都不是1000

2. 多线程安全地添加元素到数组

多个线程可能同时访问 NSMutableArray,如果没有同步措施,可能会崩溃:

@interface SafeArray : NSObject
@property (nonatomic, strong) NSMutableArray *array;
@end@implementation SafeArray- (instancetype)init {if (self = [super init]) {_array = [NSMutableArray array];}return self;
}- (void)addItem:(id)item {@synchronized (self) {[self.array addObject:item];}
}@end

注意事项

  • 性能开销@synchronized 会带来一定的性能开销,因为每次进入和退出 @synchronized 块都需要进行锁的获取和释放操作。因此,在性能敏感的场景下,应谨慎使用。
  • 死锁风险:如果在 @synchronized 块中嵌套使用 @synchronized 块,并且使用相同的锁对象,可能会导致死锁。因此,在使用 @synchronized 时,要避免出现死锁的情况。

http://www.mrgr.cn/news/90460.html

相关文章:

  • 自己动手实现一个简单的Linux AI Agent
  • 路由过滤方法与常用工具
  • DeepSeek的大模型介绍
  • KubeSphere 和 K8s 高可用集群离线部署全攻略
  • FastAPI 请求和响应
  • OpenSSH 降级操作指南
  • 使用 Express 写接口
  • 自己部署DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)
  • 通过钉钉创建个人AI助理:无需官网即可使用DeepSeek满血版全攻略
  • [极客大挑战 2019]PHP
  • 【竞技宝】LOL-LPL:EDG3-0零封LNG
  • 图神经网络怎么和LLM结合
  • 前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截
  • 使用EVE-NG-锐捷实现ACL访问控制
  • C++ 设计模式-桥接模式
  • QML的属性绑定
  • 【第三节】CMake 的构建流程
  • 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)
  • 如何在 GitHub 上写博客
  • Open Liberty使用指南及微服务开发示例(六)
  • 《Python百炼成仙》11-20章(不定时跟新)
  • 在Windows 7操作系统,基于llama.cpp本地化部署 deepseek-r1模型的方法 2025-02-08
  • 如何在 Linux 中管理自定义脚本:将 ~/bin 目录添加到 $PATH
  • 301.华为交换机堆叠技术基础
  • 前端快速生成接口方法
  • 消息队列学习