NSThread - 4
来源:互联网 发布:合肥网络推广公司 编辑:程序博客网 时间:2024/05/20 23:39
首先参考:http://www.tuicool.com/articles/nQVrMv
上一篇了解到了利用属性声明关键字atomic原子性可以阻止线程并行操作的问题,但是究竟能不能解决上面的问题呢?
#import "LBThreadSecAtomViewController.h"@interface LBThreadSecAtomViewController ()@property(atomic,assign) int leftTicketsCount;@property(nonatomic,strong)NSThread *thread1;@property(nonatomic,strong)NSThread *thread2;@property(nonatomic,strong)NSThread *thread3;@end@implementation LBThreadSecAtomViewController- (void)viewDidLoad{ [super viewDidLoad]; self.leftTicketsCount = 10; self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil]; self.thread1.name = @"售票员A"; self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil]; self.thread2.name = @"售票员B"; self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil]; self.thread3.name = @"售票员C"; }- (void)sellTickets{ while (1) { if (self.leftTicketsCount > 0) { [NSThread sleepForTimeInterval:0.002]; self.leftTicketsCount = self.leftTicketsCount - 1; NSThread* current = [NSThread currentThread]; NSLog(@"%@--卖了一张票,还剩余%d张票",current,self.leftTicketsCount); } else { [NSThread exit]; } }}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ [self.thread1 start]; [self.thread2 start]; [self.thread3 start];}@end
注意到,操作的票数属性变量声明为atomic:
@property(atomic,assign) int leftTicketsCount;
运行结果:
原来,在第一次读取的时候没能阻止并发的读取造成的资源公用问题,但是在第一次操作后的其余操作就会达到加锁的效果。
那该怎么解决? 待续...
补充还可以通过同步操作来限制对资源的不当读取代替锁等等其他好的方法。
0 0
- NSThread - 4
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- Android Studio 快捷键整理分享
- NewSQL数据库VoltDB特性简介
- 网络传输中常遇到的协议
- iOS更改项目名详情
- spring MVC中引入captcha的插件生成图片验证码
- NSThread - 4
- 面试“最后一问”该这么问!
- [2002]:计算球体积(简单)
- 第三天
- Hangman Judge
- Java线程同步:synchronized锁住的是代码还是对象
- MySQL/HandlerSocket和VoltDB:NoSQL的竞争者
- 克鲁斯卡算法 并查集实现最小生成树(伪代码)
- iOS 广播小结