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();
    }
}
相关推荐
捕鲸叉7 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点7 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰7 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus7 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵7 小时前
设计模式-迭代器
设计模式
lexusv8ls600h9 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc11 小时前
抽象工厂模式
java·设计模式·抽象工厂模式
无敌岩雀14 小时前
C++设计模式结构型模式———外观模式
c++·设计模式·外观模式
hxj..15 小时前
【设计模式】观察者模式
java·观察者模式·设计模式
XYX的Blog17 小时前
设计模式09-行为型模式2(状态模式/策略模式/Java)
设计模式·状态模式·策略模式