iOS开发基础35-多线程之NSThread
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源6.iOS开发基础3-UIImage7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式12.iOS开发基础9-提示框(UIAlertController)13.iOS开发基础8-UIScrollView14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别17.iOS开发基础28-数据存储与沙盒机制18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD
55.iOS开发基础35-多线程之NSThread
56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化本文将详细介绍 NSThread
多线程编程的基本使用方法、线程状态的管理、多线程的安全隐患及其解决方案、原子属性和非原子属性的选择,总结这些知识点及其底层逻辑。
一、基本使用
1. 创建和启动线程
在 iOS 中,一个 NSThread
对象代表一条线程。创建和启动线程的基本方法如下:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
// 线程一启动,就会在线程 thread 中执行 self 的 run 方法
主线程相关操作:
+ (NSThread *)mainThread; // 获取主线程
- (BOOL)isMainThread; // 判断当前线程是否为主线程
+ (BOOL)isMainThread; // 同样用于判断当前线程是否为主线程
2. 其他用法
获得当前线程的方法:
NSThread *current = [NSThread currentThread];
设置和获取线程名字的方法:
- (void)setName:(NSString *)n;
- (NSString *)name;
3. 其他创建线程的方式
创建线程后自动启动线程:
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
隐式创建并启动线程:
[self performSelectorInBackground:@selector(run) withObject:nil];
优缺点:
优点:
- 简单快捷,使用方便。
缺点:
- 无法对线程进行更详细的设置,例如线程优先级、栈大小等。
二、线程状态
1. 线程状态
线程的基本状态包括:新建(New)、就绪(Ready)、运行(Running)、阻塞(Blocked)和死亡(Dead)。
2. 控制线程状态
启动线程:
- (void)start;
// 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态
阻塞(暂停)线程:
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 进入阻塞状态
强制停止线程:
+ (void)exit;
// 进入死亡状态
注意:一旦线程停止(死亡)后,无法再次启动该线程。终止线程前,应释放之前分配的资源以避免内存泄漏。
三、安全隐患
1. 多线程的安全隐患
资源共享:
当多个线程访问同一块资源时,可能会引发数据错乱和数据安全问题。例如,多个线程同时访问同一个对象、变量或文件。
2. 安全隐患解决 – 互斥锁
互斥锁用于防止多线程同时访问同一资源,造成数据不一致。其使用方法如下:
@synchronized(锁对象) {
// 需要锁定的代码
}
注意点:
- 锁定一段代码只用一把锁,多把锁无效。
- 锁定的代码范围应尽量小,避免降低执行效率。
- 如果只有一个地方需要加锁,通常使用
self
作为锁对象。
互斥锁的优缺点:
优点:
- 能有效防止因多线程抢夺资源造成的数据安全问题。
缺点:
- 消耗大量的 CPU 资源。
相关专业术语:线程同步
线程同步的意思是多条线程按顺序地执行任务,互斥锁使用了线程同步技术。
3. 自旋锁与互斥锁
共同点:
- 都能够保证同一时间,只有一条线程执行锁定范围的代码。
不同点:
- 互斥锁:如果发现有其他线程正在执行锁定的代码,当前线程会进入 "休眠" 状态,等待其他线程执行完毕,锁被释放后再被 "唤醒"。
- 自旋锁:如果发现有其他线程正在执行锁定的代码,当前线程将 "一直等待" 锁定代码执行完毕,适合执行非常短的代码。
无论何种锁,都会带来一定的代价。日常开发中,尽量减少使用锁的机会,将耗时操作放在后台执行是多线程的主要目的。
四、原子和非原子属性
1. 属性
在定义属性时,有 nonatomic
和 atomic
两种选择。
atomic
(原子属性):为setter
方法加锁,是默认属性。nonatomic
(非原子属性):不为setter
方法加锁。
2. 原子和非原子属性的选择
对比:
atomic
:多线程安全,但性能较差。nonatomic
:性能较好,但不具备线程安全性,适合内存资源有限的移动设备。
iOS 开发建议:
- 所有属性都声明为
nonatomic
。 - 避免多线程争抢同一资源。
- 将加锁、资源争抢问题交由服务器处理,减轻客户端压力。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!