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
今天三更了,就到这里了,大家晚安。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。