ios-UI高階 多執行緒的互斥解決

A_StayFoolish發表於2016-08-04
1、控制執行緒狀態

· 啟動執行緒
- (void)start;

· 阻塞執行緒
+ (void)sleepUntilDate:(NSDate *)date;
- (void)sleepForTimeInterval:(NSTimeInterval *)interval;

· 強制停止執行緒
+ (void)exit;  

注:一旦執行緒停止(死亡)了,就不能再次開啟任務。
 2、多執行緒的安全隱患
· 資源共享
 一塊資源可能會被多個執行緒共享,即多個執行緒可能訪問同一塊資源;比如多個執行緒同時訪問一個物件,這樣就存在安全隱患
 3、安全隱患的解決方法--互斥鎖
 · 互斥鎖使用格式
 @synchronized(鎖物件) {
  // 需要鎖定的程式碼
 }
 注意:鎖定一份程式碼的鎖必須是同一把鎖才能達到目的

 互斥鎖的優缺點:
 優點:能有效防止因多執行緒搶奪資源造成的資料安全問題
 缺點:需要消耗大量的CPU資源

 互斥鎖的使用前提是:多條執行緒同時訪問同一資源

 互斥鎖也稱執行緒同步:即多條執行緒在同一條線上執行(按順序的執行任務)

ViewController.m檔案中:

@interface ViewController ()

// 建立4個程式

@property(nonatomic,strong) NSThread *thread1;

@property(nonatomic,strong) NSThread *thread2;

@property(nonatomic,strong) NSThread *thread3;

@property(nonatomic,strong) NSThread *thread4;

@property(nonatomic,assign) NSInteger moneyValue;

@end


@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    //初始化程式

    self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(takeMoney) object:nil];

    self.thread1.name = @"路人1";

    self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(takeMoney) object:nil];

    self.thread2.name = @"路人2";

    self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(takeMoney) object:nil];

    self.thread3.name = @"路人3";

    self.thread4 = [[NSThread alloc] initWithTarget:self selector:@selector(takeMoney) object:nil];

    self.thread4.name = @"路人4";

    

}


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

    // 啟動程式

    [self.thread1 start];

    [self.thread2 start];

    [self.thread3 start];

    [self.thread4 start];

}


-(void)takeMoney{

    self.moneyValue = 6000;

    

    while (1) {

        //互斥鎖

        @synchronized(self) {

            if (self.moneyValue > 0) {

                NSInteger value = self.moneyValue;

                self.moneyValue = value - 200;

                NSLog(@"%@取錢後,取款機還剩下%ld",[NSThread currentThread].name,self.moneyValue);

            }else {

            NSLog(@"取款機沒有餘額了");

            break;

            }

        }

    }

}

結果截圖:



相關文章