资源共享
- 1块资源可能会被多个线程共享,也就是多线可能会被访问同一块资源
- 比如多个线程访问同一个对象,同一个变量,同一个文件
- 当多个线程访问同一块资源时,很容易发生数据错乱额数据安全问题
当有一个人存钱有一个取钱
当存钱的人查询余额时查询到1000但很巧的是取钱的人比你晚一点点
取钱的人查询余额查询到1000
然后存钱的人存1000余额显示2000
但取钱的的人取走500在写入数据库因为他们是同一个大线程所以2000得余额变为500
买票
两个人买票数据只减1
模拟买票
@interface ViewController ()
//总票数
@property(nonatomic,assign)int tickets;
@end
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//剩余20张票
self.tickets=20;
//增加子线程
NSThread *threadA=[[NSThread alloc] initWithTarget:self selector:@selector(saleTickes) object:nil];
threadA.name=@"买票员A";
[threadA start];
NSThread *threadB=[[NSThread alloc] initWithTarget:self selector:@selector(saleTickes) object:nil];
threadB.name=@"买票员B";
[threadB start];
}
#pragma mark--买票--
/*
建议开发死比较复杂的多线程程序是,可以先在主线程实现功能
2.实现功能以后可以把耗时的放到子线程
3.增加一个线程,建议开发的时候,线程一个一个增加
*/
-(void)saleTickes
{
while (YES)
{
//模拟一下延时,买票一张休息1秒
[NSThread sleepForTimeInterval:1.0];
//判断是否还有票
if (self.tickets>0)
{
//2.如果有票,就买一张
self.tickets--;
NSLog(@"剩余的票数--%d--%@",self.tickets,[NSThread currentThread]);
}
else
{
NSLog(@"没有票");
break;
}
}
}