android设计模式-单例模式

转:https://www.jianshu.com/p/9c32aea34b6d

单例模式是运用最广泛的设计模式之一,在应用这个模式时,单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如线程池,缓存,网络请求,IO操作,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例,这种就是单例模式比较好的使用场景。确保一个类只有一个实例,并且自行实例化。向整个系统提供这个唯一的实例。

几个关键点:

1.构造函数用private,让外部无法访问,就没办法去重写实例化

2.使用最关键的关键词static,针对他的特性,内存中只有一份数据。

如:

复制代码
public class SingletionStarving {

    private static final SingletionStarving mInstance = new SingletionStarving();

    private SingletionStarving() {

    }

    public static SingletionStarving getInstance() {
        return mInstance;
    }
}

实用的写法:

复制代码
public class SingletionDLC {

    private volatile static SingletionDLC mInstance;

    private SingletionDLC() {}

    public static SingletionDLC getmInstance() {
        if (mInstance == null) {
            synchronized (SingletionDLC.class) {
                if (mInstance == null) {
                    mInstance = new SingletionDLC();
                }
            }
        }
        return mInstance;
    }
}

1、构造函数用private修饰,外部无法访问

2、使用的时候即调用getInstance的时候才初始化

3、static关键字修饰,静态变量,存储在内存中,只有一份数据

4、synchronized线程安全,多线程情况下单例的唯一性

5、两次判断空,避免多次同步(synchronized)

synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。

volatile 说白了就是被修饰的变量会被不同的线程访问和修改,也是一个轻量级的同步机制

可见性:当某一个线程对共享变量的修改 ,其他线程可以立刻看到修改之后的值

防止编译器优化:编译器在优化代码时会尝试将变量的访问操作优化为更高效的方式,例如将变量的值缓存在寄存器中。然而,对于某些特殊的变量,如多线程环境下的共享变量、中断处理中的标志位、硬件寄存器等,这种优化可能会导致意外的行为。使用 volatile 关键字可以告诉编译器不要对该变量进行优化,确保每次访问都从内存中读取或写入。

处理多线程共享变量:在多线程编程中,当一个变量被多个线程共享并且可能被一个线程修改时,需要使用 volatile 关键字来确保线程之间的可见性。这样可以防止编译器对共享变量的优化,确保每个线程都能正确地读取到最新的值。

处理中断和硬件寄存器:在中断处理程序中,某些变量可能由硬件直接修改,而不是通过常规的变量赋值操作。在这种情况下,使用 volatile 关键字可以确保编译器不会对这些变量的访问进行优化,以避免出现不一致的行为。

内部类的方式,也推荐使用

复制代码
public class SingletionInternalClass {

    private SingletionInternalClass() {}

    public static SingletionInternalClass getInstance() {
        return SingletionInternalClassHolder.instance;
    }

    private static class SingletionInternalClassHolder {
        private static final SingletionInternalClass instance = new SingletionInternalClass();
    }
}
相关推荐
Aeside113 小时前
漫谈代理模式,静态代理到 JDK 和 CGLIB 动态代理
java·设计模式
小凯 ོ15 小时前
实战原型模式案例
java·后端·设计模式·原型模式
TechNomad16 小时前
设计模式:适配器模式(Adapter Pattern)
设计模式·适配器模式
jingfeng51418 小时前
线程池及线程池单例模式
linux·开发语言·单例模式
UrSpecial18 小时前
设计模式:责任链模式
设计模式·责任链模式
指针刺客18 小时前
嵌入式筑基之设计模式
开发语言·c++·设计模式
简色18 小时前
领悟8种常见的设计模式
java·后端·设计模式
牛奶咖啡1319 小时前
学习设计模式《二十四》——访问者模式
学习·设计模式·访问者模式·认识访问者模式·访问者模式的优缺点·何时选用访问者模式·访问者模式的使用示例
TechNomad19 小时前
设计模式:组合模式(Composite Pattern)
设计模式·组合模式
找不到、了20 小时前
Java设计模式之《外观模式》
java·设计模式·外观模式