多线程的安全隐患


1.  资源共享
1块资源可能会被多个线程共享,也就是 多个线程可能会访问同一块资源;
比如多个线程访问同一个对象、同一个变量、同一个文件;
当多个线程访问同一块资源时,很容易引发 数据错乱和数据安全问题。

2. 安全隐患示例 存钱取钱


3. 安全隐患分析


4. 安全隐患解决互斥锁


5. 互斥锁使用格式

@synchronized(锁对象) {// 需要锁定的代码 }

注意:锁定1份代码只用1把锁,用多把锁是无效的。


6. 互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题。
缺点: 需要消耗大量的 CPU 资源

7. 互斥锁的使用前提:
多条线程抢夺同一块资源。

8. 相关专业术语: 线程同步
线程同步的意思是:多条线程按顺序地执行任务。
互斥锁,就是使用了线程同步技术。


9.互斥锁的一个Demo


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [self demo];

}

-(void)demo {

    //模拟2个卖票窗口

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];

    thread.name = @"买票窗口1";

    [thread start];

    

    NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];

    thread2.name = @"买票窗口2";

    [thread2 start];

}

//卖票

-(void)sellTicket{

    while (YES) {

        //模拟网络卡

        [NSThread sleepForTimeInterval:1];

     //互斥锁运行步骤详解:    

        //线程1 票数 读取5 时间到 保存票数5

        //线程2 票数 读取5 时间到 保存票数5

        //线程1 票数5 还原票数5 5-1=4 输出4

        //线程2 票数4 还原票数5 5-1=4 输出4

        

        //任意对象

// NSObject *obj = [[NSObject alloc] init];

        

        //加锁的语法,括号内为锁的对象,每个对象内都有一把锁,默认锁是开着的

        //同步锁

//[NSUserDefaults standardUserDefaults] synchronize 方便书写synchronized

        @synchronized(self.obj){

            if(self.tickets >0){

                self.tickets = self.tickets - 1;

                NSLog(@"%@ 余票 %d",[NSThread currentThread],self.tickets);

                continue;

            }

        }

        NSLog(@"没有票啦");

        break;

    }

}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值