@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
时间: 2024-10-06 15:44:10