OBObjective-c 多线程(锁机制) 解决资源抢夺问题
2015-12-25 00:00
435 查看
//
// ViewController.m
// 解决资源抢夺问题
//
// Created by DC017 on 15/12/25.
// Copyright © 2015年 DC017. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
//nonatomic 属性读取的是内存数据(寄存器计算好的结果)
//atomic 属性保证直接读取寄存器的数据,*****[这样就不会出现一个线程正在修改数据,而另一个线程读取了修改之前的属性]*****永远保证同时只有一个线程在访问一个属性
{
NSLock * lock;
}
@property(atomic,strong)NSMutableArray * muarray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_muarray=[[NSMutableArray alloc]init];
[_muarray addObjectsFromArray:@[@"1.上",@"2.中",@"3.下"]];
[self beginSell];
lock=[[NSLock alloc]init];
}
#pragma mark 锁机制
//IOS 中常用两种方法
//1.NSLock
//2.@synchronized
-(void)buyTicket:(int)buyer{
//1.NSLock
// [lock lock];
//使用时,把需要枷锁的代码放在Locck和unlock之间
//当一个线程A进入枷锁代码后,另一个线程B他就无法访问,只能当线程A执行完成任务以后,才能访问
//2.@synchronized
@synchronized(self) {
if (_muarray.count>0) {
NSLog(@"%d号顾客买到了票:%@",buyer,[_muarray lastObject]);
[_muarray removeLastObject];
}else{
NSLog(@"%d顾客没有抢到票",buyer);
}
} // [lock unlock];
}
-(void)beginSell{
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建10个线程用于抢票(10个人来买票)
for (int i=0; i<10; i++) {
//异步操作
dispatch_async(globalQueue, ^{
[self buyTicket:i];
});
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
// ViewController.m
// 解决资源抢夺问题
//
// Created by DC017 on 15/12/25.
// Copyright © 2015年 DC017. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
//nonatomic 属性读取的是内存数据(寄存器计算好的结果)
//atomic 属性保证直接读取寄存器的数据,*****[这样就不会出现一个线程正在修改数据,而另一个线程读取了修改之前的属性]*****永远保证同时只有一个线程在访问一个属性
{
NSLock * lock;
}
@property(atomic,strong)NSMutableArray * muarray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_muarray=[[NSMutableArray alloc]init];
[_muarray addObjectsFromArray:@[@"1.上",@"2.中",@"3.下"]];
[self beginSell];
lock=[[NSLock alloc]init];
}
#pragma mark 锁机制
//IOS 中常用两种方法
//1.NSLock
//2.@synchronized
-(void)buyTicket:(int)buyer{
//1.NSLock
// [lock lock];
//使用时,把需要枷锁的代码放在Locck和unlock之间
//当一个线程A进入枷锁代码后,另一个线程B他就无法访问,只能当线程A执行完成任务以后,才能访问
//2.@synchronized
@synchronized(self) {
if (_muarray.count>0) {
NSLog(@"%d号顾客买到了票:%@",buyer,[_muarray lastObject]);
[_muarray removeLastObject];
}else{
NSLog(@"%d顾客没有抢到票",buyer);
}
} // [lock unlock];
}
-(void)beginSell{
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建10个线程用于抢票(10个人来买票)
for (int i=0; i<10; i++) {
//异步操作
dispatch_async(globalQueue, ^{
[self buyTicket:i];
});
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- objective-c 动画 花瓣飘落
- javascript Object的新方法
- Using ActiveX Object in Qt
- 深入理解Objective-C:优化你的代码
- Objective - C UITabbarController
- Objective-C 省市区 三个tableView联动
- 【Objective-C学习记录】第二十三天
- Objective-C 集合之NSDictionary的常用方法
- Objective - C tableView自适应高度 & KVC (Key -Value-Coding)
- Objective-C tableView自定义cell
- How to call an Objective-C Method from a C Method?
- Objective - C UITableView界面传值 从前往后,从后往前
- Objective - C UITableView学习笔记
- 【转】Android自动化测试(UiAutomator)——UiObject
- java线程同步:使用Object的wait,notify,notifyAll做线程调度
- Objective--C 导航视图控制器
- Objective-C基础1-类目(Category)和延展(Extension)的区别
- Objective-C 集合之NSArray的常用方法
- Objective-C NSObject 的实现分析(2014-10-23更新)
- Objective-C Runtime 总结:消息机制 篇