Glide图片加载 使用的单例模式
来源:互联网 发布:如何防范网络黑客攻击 编辑:程序博客网 时间:2024/05/16 14:42
一.单例模式
我们来看看Glide类源码的实现
public class Glide {private static volatile Glide glide;…… /** * Get the singleton. * * @return the singleton */ public static Glide get(Context context) { if (glide == null) { synchronized (Glide.class) { if (glide == null) { Context applicationContext = context.getApplicationContext(); List<GlideModule> modules = new ManifestParser(applicationContext).parse(); GlideBuilder builder = new GlideBuilder(applicationContext); for (GlideModule module : modules) { module.applyOptions(applicationContext, builder); } glide = builder.createGlide(); for (GlideModule module : modules) { module.registerComponents(applicationContext, glide); } } } } return glide; }}
上面这种单例模式优点是既能够在需要市才初始化单例,又能够保证线程安全,且单例对象初始化后调用get不进行同步锁。
在get方法中对glide进行了两次判空:第一层主要是为了避免不必要的同步,第二层的判断是为了在null的情况下创建实例。一下是具体的分析。
如果线程A执行到 glide=new Glide()时会执行一下操作:
1.给Glide的实例分配内存
2.调用Glide的构造方法(这个方法没有粘出来可以自己去看看)
3.将glide对象指向分配的内存空间(此时glide就不是null了)
由于java编辑器允许处理器乱序执行,以及jdk1.5之前JMM(java Memory Model,即java内存模型)中cache、寄存器到主内存的规定,上面的2.3的执行顺序是无法保证的,如果顺序是1.3.2,在3执行完毕,2未执行之前被切换到线程B上,这时候glide因已经在线程A内执行到3,glide已经是非空了,所以在线程B直接取走glide再使用的时候就会报错。
JDK1.5之后已经调整了JVM,具体化了valatile关键字,之后的版本只需要将glide的定义改成volatile就可以保证glide对象每次都是从主内存中读取,这就完成了单例模式。
注:
synchronized 的使用:http://blog.csdn.net/luoweifu/article/details/46613015
synchronized
同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用
synchronized 修饰的方法 或者 代码块。
volatile
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。
- Glide图片加载 使用的单例模式
- 使用glide加载图片
- 使用Glide加载图片
- Glide的图片加载库的使用
- Glide 的图片加载的使用
- Glide图片加载库的使用
- 39.Glide图片加载框架的使用
- Glide图片加载库的使用
- Glide图片加载库的使用
- Android Glide图片加载库的使用
- Android Glide图片加载库的使用
- 图片加载框架-Glide的使用
- Android Glide图片加载库的使用
- Glide图片加载库的使用
- Android Glide图片加载库的使用
- 图片加载库Glide的入门使用
- 图片加载控件Glide的使用
- Glide图片加载库的使用
- javascript创建数组的几种方式
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 机智:如何让用户觉得你的App加载速度很快?
- 组合数
- 贪吃蛇游戏的C语言实现
- Glide图片加载 使用的单例模式
- Java 服务器端修改apk并重新打包签名
- java读取文件的两种方法:java.io和java.lang.ClassLoader
- 从头开始安装Ubuntu,cuda,cudnn,caffe,tensorflow,ROS
- 简单问题
- 剑指Offer patitionArray
- 机器学习系列-------机器学习路线图(附资料)
- PE文件解析
- LeetCode题解:Kth Smallest Element in a BST