1. 程式人生 > >NSThread鎖的使用(多執行緒資源共享的問題)

NSThread鎖的使用(多執行緒資源共享的問題)

之前已經瞭解了NSThread如何建立執行緒,以及執行緒當中的2個屬性。
現在我們用一個購票案例,來模擬一下執行緒當中資源共享的問題。

1.建立一個售票類

//
//  TicketManager.h
//  TestThread


#import <Foundation/Foundation.h>

@interface TicketManager : NSObject
// 開始賣票
- (void)startToSale;
@end
//
//  TicketManager.m
//  TestThread


#import "TicketManager.h"
#define TotalTickets 50 //總票數
@interface TicketManager() // 剩餘票數 @property(nonatomic,assign) int limitTickets; // 賣出票數 @property(nonatomic,assign) int saleCount; // 執行緒一(北京售票點) @property(nonatomic,strong)NSThread *threadBJ; // 執行緒二(上海售票點) @property(nonatomic,strong)NSThread *threadSH; @end @implementation TicketManager // 初始化方法中,建立2個執行緒
- (instancetype)init { if (self = [super init]) { self.limitTickets = TotalTickets; self.threadBJ = [[NSThread alloc] initWithTarget:self selector:@selector(sale) object:nil]; [self.threadBJ setName:@"北京售票點"]; self.threadSH = [[NSThread alloc] initWithTarget:self
selector:@selector(sale) object:nil]; [self.threadSH setName:@"上海售票點"]; } return self; } // 賣票的動作 - (void)sale { while (true) { // 如果還有餘票 if (self.limitTickets > 0) { [NSThread sleepForTimeInterval:0.5]; self.limitTickets--; self.saleCount = TotalTickets - self.limitTickets; NSLog(@"%@:當前餘票:%d,已經售出:%d", [NSThread currentThread].name,self.limitTickets, self.saleCount); } } } // 開始賣票了(開始執行2個執行緒) - (void)startToSale { [self.threadBJ start]; [self.threadSH start]; } @end

2.我們到控制器裡 引入這個類,呼叫開始賣票的方法

#import "TicketManager.h"
    TicketManager *mgr = [[TicketManager alloc] init];
    [mgr startToSale];

這裡寫圖片描述
從列印的log,可以看出賣票出問題啦。

如果來解決2個售票點資源共享的問題呢?
用鎖的思想。
在這裡具體就是用@synchronized,把買票的邏輯處理放入其中。

// 賣票的動作
- (void)sale
{
    while (true) {
        @synchronized (self) {
            // 如果還有餘票
            if (self.limitTickets > 0) {
                // 這句是用來模擬賣票的時間間隔
                [NSThread sleepForTimeInterval:0.5];

                self.limitTickets--;
                self.saleCount = TotalTickets - self.limitTickets;

                NSLog(@"%@:當前餘票:%d,已經售出:%d", [NSThread currentThread].name,self.limitTickets, self.saleCount);
            }
        }
    }
}

這裡寫圖片描述
這樣就解決了2個執行緒(2個售票點)共享資源(共同售賣50張票)的問題。