美文网首页
资源共享问题,同步锁和自旋锁

资源共享问题,同步锁和自旋锁

作者: zhouios | 来源:发表于2016-12-08 16:43 被阅读0次

    一,自旋锁
    1,nonatomic 非原子性,getter setter 方法都不加锁,多个线程都可以访问;
    2,atomic 原子性,内部有一把锁,锁的是赋值的setter方法,读取操作没有上锁,叫做自旋锁。

    @property(atomic,strong) NSObject *obj;
    
    //生成属性对应的成员变量
    @synthesize obj = _obj;
    //模拟原子属性
    - (void)setObj:(NSObject *)obj{
        //加锁
        @synchronized(self) {
            _obj = obj;
        }
    }
    
    - (NSObject *)obj{
        return _obj;
    }
    

    二,同步锁又叫做互斥锁
    一个例子:卖火车票,同时多个人通过网络来购票,那么就会资源共享(假如还有5张火车票,此时同时有6个人来通过网络买票,那么他们会发现剩余的票数是5张,他们同时来购买,就会造成每个人买票过后,剩余票数是5-1=4张,其实票数剩余为0,而且其中会有一人没有买到票),那么就可以通过加锁的方式来解决。

    //卖票的方法
    -(void)sellTicket{
        while (YES) {
            //模拟网络卡
            [NSThread sleepForTimeInterval:1];        
            //加锁的语法,括号内为锁的对象,每个对象内都有一把锁,默认锁是开着的
            //同步锁,互斥锁
            @synchronized(self){
               //tickets是火车票的票数
                if(self.tickets >0){//tickets在上面设置成了自旋锁,但是任然不能够代替同步锁,因为自旋锁仅仅只是对赋值进行同步锁,而这里不仅仅是对赋值进行,还有对票数的读取操作.当一个线程在执行这个操作的时候,那么下一个来的线程,会不断的判断这把锁里面的状态,到底开了没有.而同步锁不是的,下一个线程是安静的等待,知道上一个线程执行完
                    self.tickets = self.tickets - 1;
                    NSLog(@"%@ 余票 %d",[NSThread currentThread],self.tickets);
                    continue;
                }
            }
            NSLog(@"没有票啦");
            break;
        }
    }
    

    相关文章

      网友评论

          本文标题:资源共享问题,同步锁和自旋锁

          本文链接:https://www.haomeiwen.com/subject/wlesmttx.html