NSThread鎖的使用(多執行緒資源共享的問題)
阿新 • • 發佈:2019-01-08
之前已經瞭解了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張票)的問題。