一、多线程安全隐患

资源共享
  一块资源可能会被多个线程共享,也就是多个线程可能会访问到一块资源
 比如多个线程访问同一个对象,同一个变量,同一个文件。
 当多线程访问同一块资源的时候,很容易引发数据错乱和数据安全问题
二、原子和非原子属性
 1>OC 在定义属性的时候有nonatomic和atomic两种选择
      * atomic:原子属性,为 setter 方法加锁
      * nonatomic:非原子属性,不会为 setter 方法加锁
        普通情况下都是在主线程做操作,所以一般都不会加锁。
  对比:
      * atomic:线程安全,需要消耗大量的资源
      * nonatomic:非线程安全,适合内存小的移动设备
 2>synchronized 与 atomic
     * synchronized:互斥锁
     * atomic:自旋锁
  共同点:都能保证同一时刻只能有一个线程操作锁住的代码
    区别
      互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会.  自动唤醒然后执行任务。
      自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。
  自旋锁应用场景:比较适合做一些不耗时的操作
三、互斥锁
· 注意点:
     - 如果多线程访问同一个资源,那么必须使用同一把锁才能锁住
     - 在开发中,尽量不要加锁,能在服务端做尽量在服务端做,如果必须要加锁,一定要记住,锁的范围不能太大,哪里有安全隐患就加在哪里。
  技巧:因为必须使用同一把锁,开发中如果需要加锁,直接使用 self 即可。

@synchronized(self) {
//线程1进来之后,锁住,2和3都再外面等待
//1、查询剩余的票数 NSUInteger count = self.totalCount;
//2、判断是否还有余票
//2.1卖票
//3 、提示客户,没有票了
if (count>0) {
[NSThread sleepForTimeInterval:0.1];
self.totalCount = count-1;
NSLog(@"%@卖了一张票,还剩%zd票",[NSThread currentThread].name,self.totalCount);
}
else
{
NSLog(@"没票了");
break;
}
}
//解锁

四、自旋锁
注意点:
只会给 setter 方法加锁,并不会给getter方法加锁。

最新文章

  1. AngularJS之Filter(二)
  2. 【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)
  3. JS MD5
  4. java通过jdbc连接impala
  5. C# 中Newtonsoft.Json的安装和使用
  6. 如何在Sqlserver2000查询分析器中,,在一个库中调用另一个数据库中的数据表
  7. JAVA平台上的网络爬虫脚本语言 CrawlScript
  8. Oracle自增列创建方法
  9. Xpath学习笔记
  10. DNS信息
  11. 浅谈Unix I/O模型
  12. USB鼠标键盘数据格式以及按键键值
  13. 【ctags/cscope/project安装使用】给神编辑器vim添加新的翅膀
  14. Arduino和ESP8266引脚图
  15. 微擎开发------day01
  16. Eclipse设置智能提示
  17. [POI2004] SZN
  18. redis编译安装
  19. node 报错:Uncaught Error: Cannot find module "!!../../../node_modules/extract-webpack-plugin/loader.js
  20. 微软职位内部推荐-Software Development Engineer II_Commerce

热门文章

  1. X-WAF简单测试体验
  2. Spring和junit测试之配置文件路径
  3. U3D各键值说明
  4. 从PC端(Ubuntu)挂载nfs网络文件系统ARM9+Linux板子上
  5. vue再次入手(数据传递②)
  6. C 预处理
  7. Linux配置示例:配置java环境变量
  8. SQL-游标-查询数据库中的所有表的数据个数
  9. @OneToMany、@ManyToOne以及@ManyToMany讲解
  10. datatable 使用LAMBDA表达查询,过滤