android 单例模式 调用方法,Android 单例模式的四种实现方式

本文详细介绍了Java中的四种单例模式实现:饿汉式、懒汉式、双重检查加锁方式和静态内部类方式。每种方式都分析了其特点、优缺点,并着重讨论了线程安全和性能影响。推荐使用双重检查加锁和静态内部类方式,以兼顾性能和线程安全性。同时,文章提到了volatile关键字在防止单例模式失效中的作用。
摘要由CSDN通过智能技术生成

一.饿汉式

public class SingletionStarving {

private static final SingletionStarving mInstance = new SingletionStarving();

private SingletionStarving() {

}

public static SingletionStarving getInstance() {

return mInstance;

}

}

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

声明静态对象时就初始化

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

final关键字,只初始化一次,所以mInstance实例只有一个。

二.懒汉式

public class SingletionSlacker {

private static SingletionSlacker mInstance;

private SingletionSlacker() {}

public static synchronized SingletionSlacker getInstance() {

if (mInstance == null) {

mInstance = new SingletionSlacker();

}

return mInstance;

}

}

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

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

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

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

缺点:没次调用getInstance都会同步一次,浪费资源

三.双重检查加锁方式

网上建议和使用最多的方法

public class Singletion {

private static Singletion mInstance;

private Singletion() {}

public static Singletion getmInstance() {

if (mInstance == null) {

synchronized (Singletion.class) { if (mInstance == null) {

mInstance = new Singletion (); }

}

}

return mInstance;

}

}

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

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

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

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

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

缺点

private static Singletion mInstance;

private Singletion() {}

public static Singletion getmInstance() {}

由于jvm特性,允许乱序执行,上面三句代码顺序不定,那么就可能出现失效的问题。

步骤一、倘若A线程执行getmInstance(),还没执行构造方法Singletion()

步骤二、此时B线程调用getmInstance()。因为A已经执行getmInstance(),所以mInstance不为空就直接获取。

步骤三、由于B直接获取,而真实情况是A线程构造方法还未执行,所以mInstance就为空了。

虽然此情况发生概率较小,但也是一种情况。为了解决这种情况,java1.6开始加入volatile关键字

private volatile static Singletion mInstance;

这样就避免了方式失效的情况。虽然会volatile消耗一些性能,所以最佳写法

public class Singletion {

private volatile static Singletion mInstance;

private Singletion () {}

public static Singletion getmInstance() { if (mInstance == null) {

synchronized (Singletion.class) { if (mInstance == null) {

mInstance = new Singletion(); }

}

}

return mInstance;

}

}

虽然volatile让方式完美,但是没有volatile关键字的写法基本能满足绝大部分情况。除非你要运行在高并发,或者java1.6之前的代码中。

四.静态内部类方式

public class SingletionInternalClass {

private SingletionInternalClass() {}

public static SingletionInternalClass getInstance() {

return SingletionInternalClassHolder.instance;

}

private static class SingletionInternalClassHolder {

private static final SingletionInternalClass instance = new SingletionInternalClass();

}

}

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

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

调用getInstance才回去加载SingletionInternalClassHolder类,确保了线程安全,保证了单例的唯一性

总结

单例模式不管用那种方式实现,核心思想都相同

1、构造函数私有化,通过一次静态方法获取一个唯一实例

2、线程安全

最后推荐使用文中**双重锁方式和静态内部类的方式**来创建单例模式。

以上就是Android 单例模式的四种实现方式的详细内容,更多关于Android 单例模式的实现的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:如何在Android studio 中使用单例模式

Android中单例模式的一些坑小结

Android开发中的单例模式应用详解

Android编程设计模式之单例模式实例详解

Android设计模式之单例模式解析

Android设计模式之单例模式详解

Android单例模式的几种方法总结

Android 单例模式 Singleton 简单实例设计模式解析

android开发设计模式之——单例模式详解

Android设计模式系列之单例模式

android设计模式之单例模式详解

Android源码学习之单例模式应用及优点介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值