ios开发网络第一天之05线程安全问题


//@synchronized(){//锁的内容};

//互斥锁(同步锁)

//如果一个数据的操作使用互斥锁锁住,那么若果一个线程正在

//对这个数据操作的时候,其他线程需要对这个数据进行操作的线程会处于阻塞状态

//当正在进行操作的线程完成之后,其他线程才恢复就绪和运行状态;

//对这个数据进行操作;

//锁定一段代码只需一把锁,用多把锁是无效的;

//缺点:消耗大量的CPU



//自旋锁(atomic)

////如果一个数据的操作使用互斥锁锁住,那么若果一个线程正在

//对这个数据操作的时候,其他线程需要对这个数据进行操作的线程会处于无限循环状态

//当正在进行操作的线程完成之后,其他线程直接去访问数据;


//线程之间的通信:

//



#import "ViewController.h"


@interface ViewController (){

    //票的数量

    int _ticketCount;

}


@end


@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //票默认有1000

    _ticketCount = 1000;

    

}


#pragma mark - 触摸事件

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

    

    //创建一个线程去买票

    NSThread *thread = [[NSThread alloc]initWithTarget:

                        self selector:@selector(saleTicket) object:nil];

    thread.name = @"A";

    

    [thread start];

    

    

    NSThread *thread2 = [[NSThread alloc]initWithTarget:self

                                               selector:@selector(saleTicket) object:nil];

    

    thread2.name = @"B";

    

    [thread2 start];

}


#pragma mark - 卖票


- (void)saleTicket{

    while (_ticketCount > 0) {

        

        @synchronized(self){

        //{}里面是需要锁的内容

            //一定要包含线程对数据操作的起始点和终点

            //开始操作到操作结束

        [NSThread sleepForTimeInterval:2];

        

            _ticketCount -= 1;

       

            NSLog(@"%@:%d",[NSThread currentThread],_ticketCount);

    

        }

    }

    NSLog(@"卖光了");

}





- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end





















你可能感兴趣的:(线程安全问题)