【Android】单例模式的推荐写法

20 篇文章 0 订阅
1 篇文章 0 订阅

单例如果考虑性能问题, 一般会选择懒汉式延迟加载

这里记录一下线程安全的单例写法

  1. 写法一: DCL
public class MySingleton {
	private static volatile MySingleton sInstance; // 防止指令乱序

	private MySingleton() {}

	public static MySingleton getInstance() {
		if (sInstance == null) { // 锁外校验, 削弱加锁导致的性能问题
			synchronized (MySingleton.class) {
				if (sInstance == null) { // 锁中校验, 确保只产生一个对象
					sInstance = new MySingleton();
				}
			}
		}
		return sInstance;
	}
}
  1. 写法二: Holder
public class MySingleton {
    private MySingleton() {}

    private static class SingletonHolder { // 静态类"主动使用"时才加载, 不同于饿汉式
	
        private static final MySingleton INSTANCE = new MySingleton();
		// 相当于加锁双重验证 = final保证初始化完成 , static保证单例;
		
    }

    public static MySingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

不论是哪种单例模式,其实例始终同Application共存亡,务必需注意其内部持有的监听或回调(addXxx,registXxx)造成的内存泄露

  • 采用软/弱引用避免这种泄露
  • 在合适的时机清除监听(如onDestroy)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值