多线程的安全隐患

资源共享

  • 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;
        }
    }
}

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值