iOS 线程安全之@synchronized的用法

时间:2023-03-10 01:18:19
iOS 线程安全之@synchronized的用法

@synchronized(self)的用法:

@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。

iOS 线程安全之@synchronized的用法

例如:一个电影院,有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 = ; 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 () {
@synchronized(self) {
// 先取出总数
NSInteger count = self.ticketCount;
if (count > ) {
self.ticketCount = count - ;
NSLog(@"%@卖了一张票,还剩下%zd张", [NSThread currentThread].name, self.ticketCount);
} else {
NSLog(@"票已经卖完了");
break;
}
}
}
} @end