atomic的实现机制;为什么不能保证绝对的线程安全

2020-12-11  本文已影响0人  iOS心安

使用atomic 修饰属性,编译器会设置默认读写方法为原子读写,并使用互斥锁添加保护。

单独的原子操作绝对是线程安全的,但是组合一起的操作就不能保证。

- (void)competition {
self.intSource = 0;

dispatch_async(queue1, ^{
for (int i = 0; i < 10000; i++) {
self.intSource = self.intSource + 1;
}
});

dispatch_async(queue2, ^{
for (int i = 0; i < 10000; i++) {
self.intSource = self.intSource + 1;
}
});
}

最终得到的结果肯定小于20000。当获取值的时候都是原子线程安全操作,比如两个线程依序获取了当前值 0,于是分别增量后变为了 1,所以两个队列依序写入值都是 1,所以不是线程安全的。
解决的办法应该是增加颗粒度,将读写两个操作合并为一个原子操作,从而解决写入过期数据的问题。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:711315161,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

上一篇下一篇

猜你喜欢

热点阅读