iOS 线程安全之@synchronized的用法
Posted 鸿鹄当高远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 线程安全之@synchronized的用法相关的知识,希望对你有一定的参考价值。
@synchronized(self)的用法:
@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。
例如:一个电影院,有3个售票员。一场电影的总数量固定。3个售票员售票时,要判断是非还有余票。
#import "ViewController.h" @interface ViewController () /** 售票员01 */ @property (nonatomic, strong) NSThread *thread01; /** 售票员02 */ @property (nonatomic, strong) NSThread *thread02; /** 售票员03 */ @property (nonatomic, strong) NSThread *thread03; /** 票的总数 */ @property (nonatomic, assign) NSInteger ticketCount; /** 锁对象 */ //@property (nonatomic, strong) NSObject *locker; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // self.locker = [[NSObject alloc] init]; self.ticketCount = 100; self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread01.name = @"售票员01"; self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread02.name = @"售票员02"; self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread03.name = @"售票员03"; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.thread01 start]; [self.thread02 start]; [self.thread03 start]; } - (void)saleTicket { while (1) { @synchronized(self) { // 先取出总数 NSInteger count = self.ticketCount; if (count > 0) { self.ticketCount = count - 1; NSLog(@"%@卖了一张票,还剩下%zd张", [NSThread currentThread].name, self.ticketCount); } else { NSLog(@"票已经卖完了"); break; } } } } @end
以上是关于iOS 线程安全之@synchronized的用法的主要内容,如果未能解决你的问题,请参考以下文章
iOS---------- @synchronized(self)的用法
线程安全之 synchronized 和 ReentrantLock