GCD的几个面试题

1题1-资源抢夺

打印结果:打印结果:部分结果

打印结果-部分

分析:这个主要是资源抢夺问题.打印结果很大程度上和计算机性能有关.本人运行打印结果一般是a=194!
变量a使用__block修饰,使其能在block内部访问并修改!
然后我们使用一个while()循环,在内部,我们创建一个异步任务,并将其放在全局队列(并发队列)中执行!
该任务会开启新的线程去执行,由于是异步所以不会等待这个异步任务执行完毕,而是又回到while循环中执行
新的任务.也就是说,在我们一次循环结束重新进入循环是,我们下一次的任务所捕获到的变量a还可能是0!
依次循环,也就是说,在a=0时,任务回来之前会添加不止一个任务到队列.
那么,当任务执行完后,a的值会被++,此时所有捕获到a的任务中的a都会变为++后的值,当再有任务执行完成后a会被重新赋值.
所以在a<10的循环里,a会被++的次数远大于10,所以a的值是从1递增的值,具体到多大,就要看系统对线程调度的能力了.
循环外部的打印:当任务返回的a<10时,循环一直在进行,循环外部的打印任务是不会被执行的,当任务返回的a>=10时
循环结束,打印当前a的值,所以a是大于等于10的值!

2

并发

结果:1>5>2>3>4

3

并发

结果:1>5>2>4>3

4

串行

结果:1>5>2>4>3

5

串行

结果:1>5>2,代码执行到此,后面代码造成死锁!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值