最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.html, 当时以为是因为weakSelf和StrongSelf造成的崩溃, 然而我尽管用了StrongSelf和WeakSelf仍然崩溃,当时我也很崩溃.

思前想后还是跟demo源码对比下吧,对比发现:

demo代码 红框里面的代码是写在 mainQueue的block里面的, 我的是写在mainQueue上面也就是子线程中的.

我蒙圈了,为啥呢? 我去请教大神,大神说:"因为你对字典进行插入(也叫写)操作,如果是多线程并发执行,可能会发生资源抢夺,资源抢夺会造成崩溃.对字典进行读操作不会造成资源抢夺"

名词解释:资源抢夺 , 我的理解是多条线程操作同一个可变对象(这里是字典),

名词解释:死锁 资源抢夺貌似跟死锁没关系

问: 解决资源抢夺有哪些方式?

答: a): 推荐的写法 @synchronized代码块

  1. @synchronized(self)
  2. {
  3. //关键代码;
  4. }

  b): NSLock同步锁. lock unLock

  c): 使用dispatch信号量

最简单的写法是 @synchronized, 我这样写也是可以的: 在子线程对字典进行写操作,但是加锁

下面的博客写的特别仔细

iOS多线程开发资源抢夺和线程间的通讯问题

http://www.cnblogs.com/huanying2000/p/6138573.html

死锁:

http://www.cnblogs.com/tufei7/p/6044384.html

dispatch_sync(dispatch_get_main_queue(), ^{

    });

在sync同步,阻塞主线程,会等待block执行完毕才返回,  当queue是串行队列,会造成死锁, 因为block要放在队列的队尾执行, block要最后执行, sync

GCD中死锁的三种方式

http://www.jianshu.com/p/f1c6e1eba5bd

多线程下载图片,滑动tableView崩溃--资源抢夺问题的更多相关文章

  1. django 多线程下载图片

    example1: from multiprocessing.dummy import Pool as ThreadPool #多线程 import time import urllib2 urls ...

  2. android 多线程下载图片

    很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载.   方法一.直接通过Android提供的Http类访问远程服 ...

  3. 多线程下载图片,同步下载http://www.importnew.com/15731.html

    package mutiDownload; import java.io.IOException; import java.io.InputStream; import java.io.RandomA ...

  4. SDWebImage 在多线程下载图片时防止错乱的策略

    在我们使用sd的时候,对tableView  上cell得图片进行异步下载的时候会遇到这样一个问题: 由于cell的重用机制,在我们加载出一个cell的时候imageView数据源开启一个下载任务并返 ...

  5. iOS多线程开发资源抢夺和线程间的通讯问题

    说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程是并发执行的,同一个资源可能被多个线程同时访问,造成资源抢夺,这个过程中如果没有锁机制往往会造成重大问题.举例来说,每年春节都是一票难 ...

  6. curl多线程下载类

    <?php /** * curl多线程下载类 */class MultiHttpRequest{ public $urls = array (); private $res = array () ...

  7. tableView异步下载图片/SDWebImage图片缓存原理

    问题说明:假设tableView的每个cell上的imageView的image都是从网络上获取的数据.如何解决图片延迟加载(显示很慢).程序卡顿.图片错误显示.图片跳动的问题. 需要解决的问题: 1 ...

  8. iOS多线程自定义operation加载图片 不重复下载图片

    摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用:   2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验   2:自定义operati ...

  9. 打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源

    前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字 ...

随机推荐

  1. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

  2. 【Java面试题】16 静态代码块,main方法,构造代码块,构造方法

    public class HelloB extends HelloA{ public HelloB() { System.out.println("HelloB"); } { Sy ...

  3. HTML5的表单所有type类型

    1.button:定义可点击的按钮(通常与 JavaScript 一起使用来启动脚本).<br /> <input id="" type="button ...

  4. CentOS6.8安装mysql并设置字符集编码

    一.安装: 1. 首先以root用户进入系统 2. 输入命令: yum install mysql mysql-server -y 等待安装完成. 3. 启动MySQL,输入命令: /etc/init ...

  5. 工厂模式(factory pattern) ------创造型模式

    创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...

  6. fireworks切图

    下载安装完成后打开软件 打开一张图片 首选参数的撤销次数改成999 按住空格键 鼠标会变成小手的形状 这时候可以拖拽图像 找到切片工具 记住缩放比例的快捷键 ctrl+空格 放大某个区域 切的时候按住 ...

  7. 关于NoSQL与SQL的区别

    简单说来:sql是关系型数据库的结构化查询语言,而nosql,一般代指菲关系型数据库,sql语句就不能用来,不过有些有leisql的查询语言,且nosql数据库没有统一的查询语言. 相关参考文章阅读: ...

  8. linux下mysql 启动命令

    1,使用service 启动.关闭MySQL服务 service mysql start service mysql stop service mysql restart 运行上面命令,其实是serv ...

  9. mongodb查询内嵌文档

    mongodb查询内嵌文档   假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{& ...

  10. mybatis由浅入深day02_3一对多查询

    3 一对多查询 3.1 需求(查询订单及订单明细的信息) 查询订单及订单明细的信息. 3.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. ...