编程设计模式01——单例模式
2019-12-05 本文已影响0人
小刘灰灰
1.单例模式定义在Android中的使用
单例模式在项目中唯一持久存在的模式,而且为整个系统提供这个实例。处理一些全局多次相同处理方式的任务。
2.单例模式的分类
2.1 最简单的饿汉式单例
package com.example.testlibary;
public class Singleton {
private static final Singleton SINGLETON = new Singleton();
//自己实现私有构造方法,无法生成多个实例对象
private Singleton() {
}
//通过该方法获取实例 存在的问题项目在初始化的该实例就会存在
//如果不用的话会存在资源的浪费
public static Singleton getSingleton() {
return SINGLETON;
}
}
2.2 懒汉式
public class Singleton {
//不加final 加了就不能初始化了
private static Singleton singleton = null;
private Singleton() {
}
//这个是线程不安全的 项目中能存在多个 Singleton的实例
public static Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
加锁的懒汉式线程式安全的。
//不加final 加了就不能初始化了
private static Singleton singleton = null;
private Singleton() {
}
//synchronized 加上一个锁 线程安全的
//存在问题是
public static synchronized Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
更加高级的懒汉式线程安全的
public class Singleton {
// 4DCL模式(双重检查锁定模式)
//volatile 内存同步共享修饰 线程安全的
//可见性。对一个 volatile 变量的读,总是能看到(任意线程)对这个 volatile 变量最后的写入。
//原子性:对任意单个 volatile 变量的读 / 写具有原子性,但类似于 volatile++ 这种复合操作不具有原子性。
private static volatile Singleton singleton = null;
private Singleton() {
}
//synchronized 加上一个锁 线程安全的
//存在问题是
public static Singleton getSingleton() {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
return singleton;
}
}
volatile关键字能够保证可见性,被volatile修饰的变量,在一个线程中被改变时会立刻同步到主内存中,而另一个线程在操作这个变量时都会先从主内存更新这个变量的值。
关于类锁,对象锁的问题自行百度吧,在单例中区别不大
3.个人推荐使用的单例模式 静态内部类的模式
public class Singleton {
private Singleton() {
}
public Singleton getInstance(){
return SingleTonHolder.singleton;
}
private static class SingleTonHolder {
private final static Singleton singleton=new Singleton();
}
}
4.还有一种是枚举的单例模式这个不是很常用的。
public enum SingleTonA {
SINGLETONA;
//添加自己需要的操作
public void method(){
}
}
5.单例应该在使用时应该注意的地方
持有Activity对象或者Content对象,导致当前Activity等无法释放,造成的内存泄漏的问题。(context泄漏)。