首先参考: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;
运行结果:
原来,在第一次读取的时候没能阻止并发的读取造成的资源公用问题,但是在第一次操作后的其余操作就会达到加锁的效果。
那该怎么解决? 待续...
补充还可以通过同步操作来限制对资源的不当读取代替锁等等其他好的方法。