很神奇的方式,加鎖。讓你們一個個通過,不要急,後面的排隊,買饅頭,唉,那個誰,叫你別急嘛,你看看你。
//
// 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
今天三更了,就到這裡了,大家晚安。