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

一,自旋锁
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;
    }
}

你可能感兴趣的:(资源共享问题,同步锁和自旋锁)