• ios33--线程安全


    //
    //  ViewController.m
    //  05-掌握-线程安全
    //
    //  多线程下载文件:每个线程下的部分可能是交错的,到时候就拼接不了。除非每个线程下载的不是交错的,而是从头到尾依次分开的,到时候就可以拼接了。
    
    #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.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";
        
        //启动线程
        //@synchronized(self) {
            [self.threadA start];
            [self.threadB start];
            [self.threadC start];
        //}
        
    }
    
    -(void)saleTicket
    {
        while (1) {
            
        //锁:必须是全局唯一的
        //1.注意枷锁的位置
        //2.注意枷锁的前提条件,多线程共享同一块资源
        //3.注意加锁是需要代价的,需要耗费性能的
        //4.加锁的结果:线程同步
        //5.锁定1份代码只用1把锁,用多把锁是无效的
    
        @synchronized(self) {
            //线程1
            //线程2
            //线程3
            NSInteger count = self.totalCount;
            if (count >0) {
                
                for (NSInteger i = 0; i<1000000; i++) {
                }
                
                self.totalCount = count - 1;
                //卖出去一张票
                NSLog(@"%@卖出去了一张票,还剩下%zd张票", [NSThread currentThread].name,self.totalCount);
            }else
            {
                NSLog(@"不要回公司上班了");
                break;
            }
            }
        }
        
    }
    
    @end
  • 相关阅读:
    JS高程3:面向对象的程序设计——理解对象
    JS高程3:函数表达式
    JS高程3:事件
    JS高程3:表单脚本
    InnoDB:表
    InnoDB:文件
    Springboot项目配置druid数据库连接池,并监控统计功能
    linux上修改mysql登陆密码
    上传本地文件到GitHub上
    logback.xml的使用,将日志异步保存到数据库中
  • 原文地址:https://www.cnblogs.com/yaowen/p/7491325.html
Copyright © 2020-2023  润新知