iosGCD线程安全之资源共享

很神奇的方式,加锁。让你们一个个通过,不要急,后面的排队,买馒头,唉,那个谁,叫你别急嘛,你看看你。

//

//  ViewController.m

//  线程安全

//

//  Created by wangqian on 15/4/11.

//  Copyright (c) 2015 wangqian. All rights reserved.

//


#import "ViewController.h"


@interface ViewController ()



@property(nonatomic,assign)NSUInteger ticketNumber;



@property(nonatomic,retain)NSThread *thread1;


@property(nonatomic,retain)NSThread *thread2;



@property(nonatomic,retain)NSThread *thread3;



//

@property(nonatomic,retain)NSLock *lock;



@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    //线程安全

    //在多线程中,经常会有多个线程需要访问或者修改同一个资源,如果不做处理,则多个线程访问或修改该资源时,有可能出现问题。

    

    //一个资源在一个时间内,只能由一个线程操作。

    

    //卖馒头,有多个线程同时卖馒头

    

    //设置初始馒头

    self.ticketNumber = 50;

    

    

    //创建锁资源,创建一把锁

    self.lock = [[NSLock alloc]init];

    

    

    self.thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"线程a卖馒头"];

    

    [self.thread1 setName:@"服务员a"];

    

    

    self.thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"线程b卖馒头"];

    [self.thread2 setName:@"服务员b"];

    

    

    

    self.thread3 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"线程c卖馒头"];

    

    

    [self.thread3 setName:@"服务员c"];

    


}



-(void)sellTickets:(id)obj

{

    //多个线程访问或者修改同一个资源时,应该对该资源进行保护(加锁)

    // 加锁注意: 锁影响的区域应该足够小。

    // 临界区 : 共享资源的使用代码区域。

    // 加锁优点 : 保护共享资源

    // 缺点 : 消耗大量的CPU资源。

    while (true) {

        

        //比第二种方法方便 非常的神奇 非常简单 只要一句话搞定

        //加互斥锁,保证在一段时间内,只能由一个线程使用共享资源

        @synchronized(self)

        {

            if (self.ticketNumber >0) {//数量大于0 就卖馒头

                self.ticketNumber -= 1;

                NSThread *thread = [NSThread currentThread];

                NSLog(@"obj = %@,%@ 卖了一个馒头,还剩%ld个馒头",obj,[thread name],self.ticketNumber);

            }else

            {

                //退出当前线程

                [NSThread exit];

            }

        }

    }

}



-(void)sellTickets2:(id)obj

{

    

    

    while (true) {

        [self.lock lock];//加锁

        if (self.ticketNumber >0) {//票数大于0 就卖票

            

            //票数减1

            self.ticketNumber -=1;

            

            

            NSThread *thread = [NSThread currentThread];

            

            

            NSLog(@"obj = %@,%@ 卖了一个馒头,还剩%ld个馒头",obj,[thread name],self.ticketNumber);

            

        }else

        {

            

            

            //退出当前线程

            [NSThread exit];

            

        }

        [self.lock unlock];//解锁

        

        

        

    }

    

    

}



//用户点击开始卖馒头

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

{

    

    

    [self.thread1 start];

    

    [self.thread2 start];

    

    

    [self.thread3 start];

    

}



@end

技术分享

技术分享

技术分享

今天三更了,就到这里了,大家晚安。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。