单例模式的理解

在面试中,遇到手写一个单例,平时敲代码没问题,但是手写。。。。乱七八糟,所以回来以后整理下单例

文章学习于 https://blog.csdn.net/anyanyan07/article/details/72039601

单例流程:

1.私有构造方法

2.创建单例对象

3.为外界提供获取单例对象的方法

随着不断的优化,单例模式也越加丰富多彩。下面是我为联系手感而附上的代码


/**
 * Created by ** 
 * 饿汉式
 * 优点:简单,线程安全
 * 缺点:实例对象是static 在声明的时候就会实例化,浪费资源
 */

public class SingleTon1 {
    /**
     * 1.私有构造方法
     */
    private SingleTon1() {
    }

    //创建实例对象
    private static final SingleTon1 singleTonInstance = new SingleTon1();

    /**
     * 对外提供方法,返回实例对象
     * @return
     */
    public static SingleTon1 getInatance() {
        return singleTonInstance;
    }
}
 
/**
 * Created by **
 * 优点:用到的时候才去实例化,在一定程度上节约了资源
 * 缺点:getInstance方法是用synchronized修饰的,该方法是同步的,为了保证线程安全,但是导致每次调用该方法的时候都会被同步,这样会消耗不必要的资源(不必要的同步开销)。所以这种模式一般不建议使用
 */

public class SingleTon2 {

    //私有构造方法
    private SingleTon2() {
    }

    private static SingleTon2 singleTonInstatce;

    //懒汉式
    private static synchronized SingleTon2 getInstance() {
        if (null == singleTonInstatce) {
            singleTonInstatce = new SingleTon2();
        }
        return singleTonInstatce;
    }
}
/**
 * Created by **
 * 优点:第一次执行getInstance方法时才会实例化,资源利用率高,效率高。
 * 缺点:偶尔失效(高并发条件下,由于JDK版本问题,在jdk1.5之前会失败)
 */

public class SingleTon3 {
    //私有化声明
    private static SingleTon3 singleInstance;

    //私有构造函数
    private SingleTon3() {
    }

    /**
     * 双重锁定
     * getInstance()方法对singleTonInstance进行两次判空,对懒汉式进行了优化,只有在第一次实例化的时候才会走第二个分支,才会同步,避免了每次都同步造成的不必要的资源消耗。
     */

    public static SingleTon3 getInstance() {
        if (singleInstance == null) {
            synchronized (SingleTon3.class) {
                if (singleInstance == null) {
                    singleInstance = new SingleTon3();
                }
            }
        }
        return singleInstance;
    }
}
/**
 * Created by **
 * 优点:线程安全,保证单例的唯一性,延迟了对象的实例化,是推荐的方式
 */

public class SingleTon4 {
    //私有化构造方法
    private SingleTon4() {
    }

    public static SingleTon4 getInstance() {
        return SingleTonHolder.singleInstance;
    }

    //第一次调用getInstance()方法的时候,虚拟机才会加载SingleTonHoulder静态内部类
    public static class SingleTonHolder {
        private static final SingleTon4 singleInstance = new SingleTon4();
    }
}
注意,在如果需要持有Context时,介意使用Application的context(生命周期长),不会造成没必要的内存泄露。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值