多线程的安全

/**
 *  资源共享
 1.一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
 2.比如多个线程访问同一个对象、同一个变量、同一个文件
 
 当多个线程引用同一个资源,会引发问题
 
 */
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _leftTicketCount = 100;
    
    self.locker = [[NSObject alloc] init];
    
    self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread1.name = @"1号窗口";
    
    self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread2.name = @"2号窗口";
    
    
    self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread3.name = @"3号窗口";
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.thread1 start];
    [self.thread2 start];
    [self.thread3 start];
}

- (void)saleTicket {
    
    // @synchronized (锁对象) 锁对象只要为唯一的对象就ok 默认的对象self就可以
    // 这把锁叫做互斥锁
    // 互斥锁使用格式
    // @synchronized (锁对象)
 
        
        while (1) {
               @synchronized (self) { // 线程锁  线程为同步的,这样限制线程的同步 ,加上一把锁,同一时间只有一个线程执行
            
            int count = self.leftTicketCount;
            
            if (count > 0) {
                
                self.leftTicketCount = count - 1;
                
                NSLog(@"%@sale one,left %d",[NSThread currentThread].name,self.leftTicketCount);
                
            } else {
                
                return;
            }
        }
    }
    
    
    // 互斥锁的优缺点
    /**
     *  优点  有效地防止因为多线程抢夺资源造成的数据安全问题
        缺点  需要耗费资源
     */
    
    // 使用前提
    // 多条线程抢夺同一块资源
    
    // 线程同步 线程同步执行  的意思 多条线程在同一条线上执行 (按顺序执行)
//    同步 不是 并行
//    为了防止多个线程抢夺同一资源造成的数据安全问题
    
    
    
    // 原子和非原子性
    /**
     *  atomic // 为setter方法加锁 为了保证线程安全,默认为atomic
     nonatomic 非原子性  不为setter方法加锁
     
     应该尽量避免多线程抢夺同一块资源
     */
    
    
    /**
     *  NSThread 1.创建和启动线程的方式 alloc detach(分离) per
     */
}


/**
 *  线程 的注意点
 1.不要同时开太多的线程 (1-3条即可) 不要超过五条
 2.主线程 UI线程 刷新显示UI界面 处理UI控件的事件
 子线程 后台线程 异步线程
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值