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




今天三更了,就到這裏了,大家晚安。

發佈了46 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章