当前位置: 首页 > 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 时,要避免出现死锁的情况。

相关文章:

@synchronized的使用

synchronized 介绍 synchronized 是 Objective-C 提供的一种 互斥锁&#xff08;Mutex&#xff09;&#xff0c;它用于确保一段代码在同一时间只有一个线程能执行&#xff0c;避免多线程访问共享资源时出现数据竞争。 基本语法 synchronized (lockObject) {// 需要加锁的代码…...

策略模式-小结

总结一下看到的策略模式&#xff1a; A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3&#xff0c;实现上面的接口。 C:一个环境类&#xff08;或者上下文类&#xff09;&#xff0c;形式可以是&#xff1a;工厂模式&#xff0c;构造器注入模式&#xff0c;枚举模式。 …...

【Stable Diffusion部署至Google Colab】

Google Colab 中快速搭建带 GPU 加速的 Stable Diffusion WebUI from google.colab import drive drive.mount(/content/drive) !mkdir /content/drive/MyDrive/sd-webui-files !pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index…...

Vue.js 与低代码开发:如何实现快速应用构建

在当今数字化高速发展的时代&#xff0c;企业对应用开发的速度和效率有着迫切的需求。传统开发模式往往周期长、成本高&#xff0c;难以满足市场的快速变化。而低代码开发的兴起&#xff0c;为这一困境带来了转机。Vue.js 作为一款流行的 JavaScript 前端框架&#xff0c;以其简…...

【无标题】《On Java中文版基础卷+进阶卷》书评

Java语言作为最热门的编程语言之一&#xff0c;关于Java语言的书更是数不胜数&#xff0c;而我选择这本《On Java中文版基础卷进阶卷》作为我学习Java语言的工具书。这本书的作者是《Java编程思想》的Bruce Eckel&#xff0c;《Java编程思想》在之前可谓是鼎鼎有名&#xff0c;…...

Spring Boot从入门到精通:核心知识点+实战指南

目录 一、Spring Boot 是什么&#xff1f;为什么它如此流行&#xff1f; 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...

网络安全 | 网络安全自动化:让防护更智能高效

网络安全 | 网络安全自动化&#xff1a;让防护更智能高效 一、前言二、网络安全自动化的核心概念2.1 定义与内涵2.2 与传统网络安全方法的区别 三、网络安全自动化的应用领域3.1 威胁检测与响应3.2 漏洞管理3.3 访问控制与身份认证 四、推动网络安全自动化发展的因素4.1 技术进…...

时间敏感和非时间敏感流量的性能保证配置

论文标题 中文标题&#xff1a; 时间敏感和非时间敏感流量的性能保证配置 英文标题&#xff1a; Provisioning of Time-Sensitive and non-Time-Sensitive Flows with Assured Performance 作者信息 Luis Velasco, Gianluca Graziadei, Sima Barzegar, Marc Ruiz Optical Co…...

502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决

502 Bad Gateway 错误通常意味着服务器之间的通信失败&#xff0c;但导致的具体原因往往因场景而异。 场景一&#xff1a;高峰期频繁出现 502 错误 1.1 现象 在流量高峰期间&#xff08;如促销活动、直播发布等&#xff09;&#xff0c;页面访问变慢甚至出现 502 错误&#…...

如何获取,CPU,GPU,硬盘,网卡,内存等硬件性能监控与各项温度传感器

首先需要下载 OpenHardwareMonitorServer 这是一个基于OpenHardwareMonitor 的 Web 服务器。可以让任何语言都可以获取硬件信息和值&#xff0c;OpenHardwareMonitorServer 是没有UI界面的因此它可以当成控制台程序使用。 该程序可用参数如下 参数&#xff1a;需要管理员权限…...

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…...

【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析  4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2019-17621 漏洞名称&#xff1a;D-Link DIR-859 命令注入漏洞 威胁等级&#xff1a;严重 漏洞详…...

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…...

fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系

Transformer、Seq2Seq、Encoder-Decoder、Attention由这四者之间的关系可以从模型架构的发展脉络来理解&#xff1a; Seq2Seq 与 Encoder–Decoder 模型 “Seq2Seq”&#xff08;sequence‐to‐sequence&#xff09;是一类用于将一个变长序列映射为另一个变长序列的任务&#x…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

图书管理项目(spring boot + Vue)

想要该项目的话&#xff0c;就 jia 我&#xff0c;并在评论区给我说一下&#xff0c;只需要1元&#xff0c;我把整个项目发给你 jia微&#xff1a;18439421203&#xff08;名字叫&#xff1a;Bingo&#xff09; 运行图片&#xff1a;...

python实现常见数学概率分布

常见正态分布 1.贝塔分布1.1 概率密度函数1.2参数对分布形状的影响1.3 应用场景1.4 python实现 2. 帕累托分布&#xff08;80/20法则&#xff09;3. 正态分布&#xff08;高斯分布&#xff09;3.1 正态分布对应性质3.2 正态分布对应图像![在这里插入图片描述](https://i-blog.c…...

解决Blender无法识别Num关闭状态下的笔记本数字键盘中Home键、End键问题

问题描述&#xff1a; 在笔记本电脑上&#xff0c;多少会缺少一些按钮&#xff0c;例如“Home”、“End”、“PgUp”、“PgDn”&#xff0c;它们在笔记本电脑上的作用是&#xff0c;如果关闭Num&#xff0c;则可以从数字键盘访问这些按钮。但问题是在Blender中&#xff0c;不论…...

React 高级教程

使用 React 高级组件&#xff08;HOC&#xff09;实现的完整项目示例&#xff0c;包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构&#xff1a; src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- He…...

基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录

目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...