/**
* 资源共享
1.一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
2.比如多个线程访问同一个对象、同一个变量、同一个文件
当多个线程引用同一个资源,会引发问题
*/
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_leftTicketCount = 100;
self.locker = [[NSObject alloc] init];
self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread1.name = @"1号窗口";
self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread2.name = @"2号窗口";
self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread3.name = @"3号窗口";
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.thread1 start];
[self.thread2 start];
[self.thread3 start];
}
- (void)saleTicket {
// @synchronized (锁对象) 锁对象只要为唯一的对象就ok 默认的对象self就可以
// 这把锁叫做互斥锁
// 互斥锁使用格式
// @synchronized (锁对象)
while (1) {
@synchronized (self) { // 线程锁 线程为同步的,这样限制线程的同步 ,加上一把锁,同一时间只有一个线程执行
int count = self.leftTicketCount;
if (count > 0) {
self.leftTicketCount = count - 1;
NSLog(@"%@sale one,left %d",[NSThread currentThread].name,self.leftTicketCount);
} else {
return;
}
}
}
// 互斥锁的优缺点
/**
* 优点 有效地防止因为多线程抢夺资源造成的数据安全问题
缺点 需要耗费资源
*/
// 使用前提
// 多条线程抢夺同一块资源
// 线程同步 线程同步执行 的意思 多条线程在同一条线上执行 (按顺序执行)
// 同步 不是 并行
// 为了防止多个线程抢夺同一资源造成的数据安全问题
// 原子和非原子性
/**
* atomic // 为setter方法加锁 为了保证线程安全,默认为atomic
nonatomic 非原子性 不为setter方法加锁
应该尽量避免多线程抢夺同一块资源
*/
/**
* NSThread 1.创建和启动线程的方式 alloc detach(分离) per
*/
}
/**
* 线程 的注意点
1.不要同时开太多的线程 (1-3条即可) 不要超过五条
2.主线程 UI线程 刷新显示UI界面 处理UI控件的事件
子线程 后台线程 异步线程
*/
多线程的安全
最新推荐文章于 2024-07-20 13:04:23 发布