当前位置: 首页 > news >正文

做一个网站的流程重庆网站建设川娃子

做一个网站的流程,重庆网站建设川娃子,宁波网站建设公司哪家口碑好,阜阳城乡建设局网站在 Objective - C 里#xff0c;atomic 特性并不能保证对象是完全线程安全的#xff0c;下面从其基本原理、部分线程安全场景以及局限性来详细说明#xff1a; 先看一个例子 #import Foundation/Foundation.hinterface MyClass : NSObject property (atomic, assi…在 Objective - C 里atomic 特性并不能保证对象是完全线程安全的下面从其基本原理、部分线程安全场景以及局限性来详细说明 先看一个例子 #import Foundation/Foundation.hinterface MyClass : NSObject property (atomic, assign) NSInteger count; endimplementation MyClass- (void)incrementCount {self.count self.count 1; }endint main(int argc, const char * argv[]) {autoreleasepool {MyClass *myObject [[MyClass alloc] init];dispatch_queue_t concurrentQueue dispatch_queue_create(com.example.concurrentQueue, DISPATCH_QUEUE_CONCURRENT);// 创建多个线程同时调用 incrementCount 方法for (int i 0; i 1000; i) {dispatch_async(concurrentQueue, ^{[myObject incrementCount];});}// 等待所有任务完成dispatch_barrier_sync(concurrentQueue, ^{NSLog(Final count: %ld, (long)myObject.count);});}return 0; } 多次执行结果 Final count: 996 Final count: 995 Final count: 991 Final count: 1000 Final count: 987 也就是说结果是不确定大概率不符合预期≠1000那么很显然多线程多操下atomic并没有保证线程安全 咱们做如下修改其他代码不变 property (nonatomic, assign) NSInteger count; 多次执行结果 Final count: 561 Final count: 765 Final count: 567 Final count: 669 Final count: 720 比原来少了也就是说atomic确实带来了一定的安全效果只不过不完全保证 atomic 基本原理 atomic 是属性声明时的一个特性使用 atomic 修饰的属性在其生成的 setter 和 getter 方法里会加锁以此来保证同一时间只有一个线程能对该属性进行读写操作。例如下面的代码 interface MyClass : NSObject property (atomic, strong) NSString *myString; endimplementation MyClass // 编译器自动生成的类似 setter 方法伪代码示意 - (void)setMyString:(NSString *)myString {synchronized(self) {_myString myString;} }// 编译器自动生成的类似 getter 方法伪代码示意 - (NSString *)myString {synchronized(self) {return _myString;} } end 部分线程安全场景 在单纯的属性读写操作中atomic 能够在一定程度上保证线程安全。比如多个线程同时对 myString 属性进行读写操作由于 setter 和 getter 方法加了锁同一时间只会有一个线程执行读写操作避免了数据竞争的问题。 atomic 的局限性 复合操作不安全atomic 只能保证单个属性的 setter 和 getter 方法是线程安全的对于复合操作无法保证线程安全。例如下面的代码 interface MyClass : NSObject property (atomic, assign) NSInteger count; endimplementation MyClass- (void)incrementCount {// 这是一个复合操作先读再写self.count self.count 1; }end 在 incrementCount 方法中先读取 count 的值然后加 1 再赋值回去。虽然 count 属性使用了 atomic 修饰但其 setter 和 getter 方法分别是线程安全的但整个 incrementCount 操作不是原子的。在多线程环境下可能会出现多个线程同时读取到相同的 count 值然后各自加 1 再赋值回去导致最终的 count 值不符合预期。 对象的其他操作不安全atomic 仅针对属性的 setter 和 getter 方法加锁对于对象的其他操作如调用对象的方法并不能保证线程安全。例如 interface MyClass : NSObject property (atomic, strong) NSMutableArray *myArray; endimplementation MyClass- (void)addObjectToArray:(id)object {// 这里对 myArray 进行操作不是 setter 和 getter 方法atomic 无法保证安全[self.myArray addObject:object]; }end 在 addObjectToArray 方法中虽然 myArray 属性使用了 atomic 修饰但对 myArray 调用 addObject: 方法时并没有加锁多个线程同时调用该方法可能会导致数据不一致的问题。 综上所述atomic 只是在属性的基本读写操作上提供了一定的线程安全保障但不能保证对象在多线程环境下的完全线程安全。如果需要更全面的线程安全还需要使用其他同步机制如 synchronized、NSLock 等来保护复合操作和对象的其他操作。 atomic vs. 真正的线程安全 atomicsynchronizedGCD 串行队列NSLock保证 setter/getter 线程安全✅✅✅✅保证多个线程同时操作的安全性❌✅✅✅推荐用于简单属性多个操作依赖同一数据并发任务处理多线程数据访问性能较好稍差高效中等
http://www.sczhlp.com/news/193561/

相关文章:

  • 网站建设专业的网站布局选择
  • 做网站可以用中文域名备案嘛做网站前期费用
  • 2015年做啥网站致富罗湖网站制作公司
  • vc域名建站的网站网站建设 ui设计公司
  • 汕头市门户网站建设深圳高端网站制作价格
  • 400网站建设做公众号和网站主页的区别
  • 高校二级网站建设意义公司vi设计什么意思
  • 网站规划与网页设计第四版电子书网上美工培训
  • 提供邯郸wap网站建设网站要精细是什么意思
  • 未经网安备案开设网站的做网站编辑应该注意什么
  • 深圳做网站推荐哪家公司好沧州网站建设哪家好
  • php做网站的分站广东高端建设网站
  • 网站调用网页怎么做移除wordpress上边栏
  • 手机网站做分享到微信wordpress怎么选择中文版
  • 如何做一个更新网站微信小程序一键生成免费
  • 网站开发岗位分析拓者吧室内设计网模型
  • 温州做网站建设公司哪家好网站开发费记什么会计科目
  • 淘宝网站制作公司wordpress 第一张图片
  • 创建企业网站山西网站开发建设
  • 无锡市网站设计智慧团建初始密码
  • 网站站点层叠样式怎么做重庆百度快照优化排名
  • 网站站长统计怎么弄九江seo优化
  • 网站是哪个建站公司做的宣城做网站的公司
  • 徐州模板建站定制网站网页设计快速培训
  • 专做坏消息的网站泰安人才网招聘网官网
  • iis访问网站打开要很久工程公司账务处理分录
  • 为何网站需改版html中文网站模板
  • 用fullpage做的网站win7iis配置网站
  • 企业网站源码千博asp个人网站论文
  • 企业更新网站的好处wordpress的登陆地址修改