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();
    }
}

相关推荐

  1. Android 设计模式

    2024-05-15 21:04:10       37 阅读
  2. android设计模式-模式

    2024-05-15 21:04:10       39 阅读
  3. Android中的设计模式---模式

    2024-05-15 21:04:10       41 阅读
  4. 设计模式

    2024-05-15 21:04:10       63 阅读
  5. 设计模式

    2024-05-15 21:04:10       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-15 21:04:10       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-15 21:04:10       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-15 21:04:10       82 阅读
  4. Python语言-面向对象

    2024-05-15 21:04:10       91 阅读

热门阅读

  1. 【设计模式】单例模式-学习记录

    2024-05-15 21:04:10       34 阅读
  2. redis中的大key问题

    2024-05-15 21:04:10       28 阅读
  3. Android Studio实现简易音乐播放器(期末作业)

    2024-05-15 21:04:10       33 阅读
  4. Android security知识点总结

    2024-05-15 21:04:10       26 阅读
  5. docker和docker-compose常用指令

    2024-05-15 21:04:10       29 阅读
  6. Python 全栈系列246 任务调度对象WFlaskAPS

    2024-05-15 21:04:10       37 阅读