资源共享
一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
比如多个线程访问同一个对象,同一个变量,同一个文件
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
安全隐患示例01 - 存钱取钱
安全隐患示例02 - 卖票下述代码使用买票案例
安全隐患分析
就拿卖票案例来做说明,假如有三个售票员卖票,此时只剩下一张票,如果同一时间内,有三位乘客来买票,三个售票员查询数据库,发现还有一张票,就各自卖给了三位乘客,这样就会照成数据安全问题了...
安全隐患解决 - 互斥锁 、 自旋锁
什么叫互斥锁 、 自旋锁?下述有详细说明
共同点:都能保证同一时刻只能有一个线程操作锁住的代码.
这里就通俗一点的说明下。上厕所原理,每个人上厕所的时候都会把门锁上,知道上完厕所下一个上厕所的人才能进入厕所。
互斥锁
** 互斥锁使用格式**
@synchronized (self){
///
}
注意:锁定1份代码只用1把锁,用多把锁是无效的
互斥锁:必须是全局唯一的
注意:
1.注意加锁的位置,加到while外部,就会造成一个售票员把所有票卖完现象
2.注意加锁的前提条件:多线程访问同一个资源
3.加锁的结果:线程同步
互斥锁的优缺点:
优点:能有效防止因多线程抢夺资源造成的数据安全问题
互斥锁的使用前提:
多条线程抢夺同一块资源
相关专业术语:线程同步
线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
卖票示例代码:
#import "ViewController.h"
@interface ViewController ()
//售票员a
@property (nonatomic, strong) NSThread *threadA;
//售票员b
@property (nonatomic, strong) NSThread *threadB;
//售票员c
@property (nonatomic, strong) NSThread *threadC;
//总票数
@property (nonatomic, assign) NSInteger totalCount;
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self thread];
}
- (void)thread
{
//设置总票数
self.totalCount = 100;
self.threadA = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
self.threadB = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
self.threadC = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
self.threadA.name = @"售票员A";
self.threadB.name = @"售票员B";
self.threadC.name = @"售票员C";
[self.threadA start];
[self.threadB start];
[self.threadC start];
}
- (void)saleTicket
{
while (1) {
@synchronized (self) {
NSInteger count = self.totalCount;
if (count > 0) {
// 如果输出的数据正常化
// 可以在此处做下UI堵塞的处理,比如for循环或线程睡眠状态即可看出效果
self.totalCount = count-1 ;
NSLog(@"%@卖了一张票,还剩下%zd张票",[NSThread currentThread].name,self.totalCount);
}else{
NSLog(@"卖完票了");
break;
}
}
}
}
@end
自旋锁
** 自旋锁atomic
使用格式**
@property (atomic, strong) UIImageView *imageView
注意:只会给 setter 方法加锁,并不会给getter方法加锁。
自旋锁的优缺点:
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:消耗大量CPU资源
http://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/
网友评论