Android 设计模式之单例模式

一、懒汉式,线程不安全


懒汉式,线程不安全

所为懒汉式,就是在需要使用这个类的对象实例的时候才会创建。

上图是线程非安全的,如果多线程去调用 getInstances() 的时候会创建多个实例,也就是说多线程情况下是不安全的。

二、懒汉式,线程安全

针对上面的线程不安全,推出了懒汉式线程安全的一种写法。在getInstances()前加上synchronized

懒汉式,线程安全。

如上图,解决了线程安全及多实例的问题,但它的效率并不高,任何时候只有一个线程去调用getInstances()

针对上面的问题,引入双重检验锁

三、双重检验锁

双重检验锁

这里进行了两次 null == instances ,第一次判断是为了避免不必要的同步,第二次判断是确保在此之前没有其他线程进入到sychronized块创建了新实例(简单讲就是防止创建多个实例)。

这种写法也会出现问题,也不是最优解。主要在于instances = new Study()这句,这并非是一个原子操作。

因为instances = new Study() 转换成指令之后主要做一下几件事:

(1)给Study 实例分配内存
(2)调用Study 构造函数来初始化成员变量。
(3)讲instances 对象指向指定的内存。

上面三个步骤中(2)和(3)并不一定是顺序执行的,可能会先执行(3)再执行(2),因为JVM的即时编辑器中存在指令重排。

优化方案:

添加volatile

使用 volatile 的主要原因是其另一个特性:禁止指令重排序优化。也就是说,在 volatile 变量的赋值操作后面会有一个内存屏障(生成的汇编代码上),读操作不会被重排序到内存屏障之前。

四、饿汉式

饿汉式,比较形象,饿了就比较急,所以在装载类的时候就创建对象实例。

饿汉式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.什么是单例 单例对象的类必须保证只有一个实例存在 对单例的实现可以分为两大类——懒汉式和饿汉式,他们的区别在于...
    Android_Liu阅读 6,218评论 0 6
  • 单例模式 懒汉式(线程不安全) 单例模式最后的目的无非就是获取当前存在的实例对象,如果没有实例对象就实例化一个,有...
    Jiwenjie阅读 3,644评论 0 3
  • 单例模式的几种实现方式 1、懒汉式,线程不安全 是否 Lazy 初始化:是是否多线程安全:否实现难度:易 描述:这...
    快感的感知阅读 2,649评论 0 0
  • 单例模式 一、定义 单例模式保证了程序中只有一个实例但是可以在全局中访问到。 二、优势 1、由于只有一个实例,故可...
    Nickyzhang阅读 10,911评论 4 19
  • 第一种(懒汉,线程不安全): Java代码 这种写法lazy loading很明显,但是致命的是在多线程不能正常工...
    Gavin_2020阅读 2,895评论 0 0