资源共享(抢夺)

资源共享-卖票

多线程开发的复杂度相对较高,在开发时可以按照以下套路编写代码:

  1. 首先确保单个线程执行正确
  2. 添加线程

卖票逻辑

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    self.tickets = 20;

    [self saleTickets];
}

/// 卖票逻辑 - 每一个售票逻辑(窗口)应该把所有的票卖完
- (void)saleTickets {
    while (YES) {
        if (self.tickets > 0) {
            self.tickets--;
            NSLog(@"剩余票数 %d %@", self.tickets, [NSThread currentThread]);
        } else {
            NSLog(@"没票了 %@", [NSThread currentThread]);
            break;
        }
    }
}

添加线程

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    self.tickets = 20;

    NSThread *t1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTickets) object:nil];
    t1.name = @"售票员 A";
    [t1 start];

    NSThread *t2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTickets) object:nil];
    t2.name = @"售票员 B";
    [t2 start];
}

添加休眠

- (void)saleTickets {
    while (YES) {
        // 模拟休眠
        [NSThread sleepForTimeInterval:1.0];

        if (self.tickets > 0) {
            self.tickets--;
            NSLog(@"剩余票数 %d %@", self.tickets, [NSThread currentThread]);
        } else {
            NSLog(@"没票了 %@", [NSThread currentThread]);
            break;
        }
    }
}

运行测试结果

互斥锁

添加互斥锁

- (void)saleTickets {

    while (YES) {
        [NSThread sleepForTimeInterval:1.0];

        @synchronized(self) {
            if (self.tickets > 0) {
                self.tickets--;
                NSLog(@"剩余票数 %d %@", self.tickets, [NSThread currentThread]);
                continue;
            }
        }

        NSLog(@"没票了 %@", [NSThread currentThread]);
        break;
    }
}

互斥锁小结

  1. 保证锁内的代码,同一时间,只有一条线程能够执行!
  2. 互斥锁的锁定范围,应该尽量小,锁定范围越大,效率越差!
  3. 速记技巧 [[NSUserDefaults standardUserDefaults] synchronize];

互斥锁参数

  1. 能够加锁的任意 NSObject 对象
  2. 注意:锁对象一定要保证所有的线程都能够访问
  3. 如果代码中只有一个地方需要加锁,大多都使用 self,这样可以避免单独再创建一个锁对象
时间: 2024-08-11 07:36:29

资源共享(抢夺)的相关文章

二、多线程深入理解

1.线程间资源共享/抢夺 (1)定义:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,当多个线程访问同一块资源时,各个线程提取和修改数据不同步,很容易引发数据错乱和数据安全问题. (2)互斥锁(线程同步) :解决上面的问题 · 代码:@synchronized(锁对象) { // 需要锁定的代码  } · 每一个对象(NSObject)内部都有一个锁(变量),当有线程要进入synchronized到代码块中会先检查对象的锁是打开还是关闭状态,默认锁是打开状态(1),如果是线程执

iOS开发——多线程

很多朋友都说iOS开发中,最难理解和学习的就是多线程,很多的原理实现都是通过log看到,也比较抽象,本人也是在多线程方面投入过很多脑细胞..无论这方面的知识掌握和应用起来是否轻松,牢固的基本功.正确的认识理解.再加上充分的实战经验,都能助你将其搞定.这里先介绍一些多线程的知识以及应用,作为讨论,大家共同学习. 一.多线程基本概念 1.线程与进程  (1)进程:操作系统的每一个应用程序就是一个进程 (2)线程:进程的基本执行单元,一个进程的所有任务都在线程中执行 2.主线程 (1)定义:一个程序运

(五十七)线程的资源共享、单例的实现

[资源共享的问题] 例如线程A与B均实现数字Num的加一操作,如果不加以限制,可能A和B先后拿到最初的Num,然后返回Num+1,无法实现Num+1之后再+1. [互斥锁] 使用互斥锁(@synchronized)来解决,让线程A操作时锁住Num,不允许B的读写,直到A操作完并且写回后,再让B进行工作,再锁住Num,直到B操作完毕,再解开锁,类似于上厕所,在厕所内要锁门一样. 使用@synchronized(self){......}包装在内的为互斥锁的作用范围,会严重降低效率.因此应尽可能的减

【新】各种打包资源共享

最近一次更新时间:2016.7.9 [简介]为了方便大家下载,特意整理出了本打包资源共享清单. 本页资源完全免费,后期不断更新. 可以直接点击链接进入百度云下载(建议先转存到百度云在下载,减小下载不成功的几率). 如果有资源不能正常下载的情况,请及时告知我,以便更新分享链接: [①部分高中资料] 高中 必修1:http://pan.baidu.com/s/1o88JRzc 语文学习资料:此分享已被取消链接: http://pan.baidu.com/s/1qYaPQ4s%20密码: 2qqh [

顺风车之争——关于“回家”的抢夺战

随着春节的逼近,返乡再度成为热门话题.与以往一样,数亿人次的返乡之途可谓八仙过海,各显神通.飞机.火车.大巴.摩托等,都是常见的返乡途径.虽然在订票及路途中会遭遇各种无奈.心酸之事,但总归还算正常范围之内.而今年与以往不同的是,通过拼车应用等,搭顺风车返乡,成为新的选择. 与其他返乡途径相比,搭顺风车可谓利弊参半.好处是乘坐环境一般相比火车硬座乃至无座.大巴硬座.摩托骑行等稍好一点,而且时间自由,基本上随时都能找到返乡的顺风车.弊端则在于安全得不到充分保障.尚未完全获得合法地位等.但无论如何,有

关于 CORS:跨域资源共享

I want to add CORS support to my server [CORS:跨域资源共享] 同源策略与JSONP

CORS(跨域资源共享)

1, 简介CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制. CORS需要浏览器和服务器同时支持.它的通信过程,都是浏览器自动完成,不需要用户参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样.浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次

跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本.但是Javascript脚本是不能获取这些资源的内容的,它只能被浏览器执行或渲染.主要原因还是出于安全考虑,浏览器会限制脚本中发起的跨站请求.(同源策略, 即JavaScript或Cookie只能访问同域下的内容).跨域的解决方案有多重JSONP.Flash.Iframe等,当然还有COR

超人学院Hadoop大数据资源共享

超人学院Hadoop大数据资源共享-----数据结构与算法(java解密版) http://yunpan.cn/cw5avckz8fByJ   訪问password b0f8 很多其它精彩内容请关注:http://bbs.superwu.cn 关注超人学院微信二维码:  关注超人学院java免费学习交流群:  版权声明:本文博主原创文章,博客,未经同意不得转载.