单例模式精讲

单例网上已经很多了,这里讲下我在美团面试遇到的问题。
首先底下的代码要求手写。

package com.lans.lwk.pracdemo.com.lans.lwk.appclass;

/**
* Created by Li on 2017/10/25.
*/

public class Singleton {
//双重锁
//可以保证线程的安全,但不完美
private static volatile Singleton singleton=null;//volatile 保证可见性和原子性和顺序性
private Singleton(){

}

public static Singleton GetInstance(){
    if(singleton==null){   (注解1)
        synchronized (Singleton.class){
            if(singleton==null){     (注解2)
                singleton=new Singleton();
            }
        }
    }
    return singleton;
}

}

注解1: //主要是为了解决效率问题,因为同步需要消耗资源
注解2://为了防止多线程执行。
上面两个注解是当时问到的问题。

但是如果能回答出来下面的单例模式,则是加分项。
//枚举单例 推荐使用枚举单例
代码简单,实现序列化,保证线程安全
enum Singleton{
INSTANCE;

private Singleton(){

}

}

将枚举单例反编译
Compiled from “Singleton.java”
public final class com.lans.lwk.pracdemo.com.lans.lwk.appclass.Singleton extends java.lang.Enum{
public static final com.lans.lwk.pracdemo.com.lans.lwk.appclass.Singleton INSTANCE;
public static final com.lans.lwk.pracdemo.com.lans.lwk.appclass.Singleton[] values();
public static com.lans.lwk.pracdemo.com.lans.lwk.appclass.Singleton valueOf(java.lang.String);
static {};
}
可以看到如上代码:自动继承了Enum类,并且INSTANCE成为了public static final常量,并且提供了values和valueOf方法保证了序列化。因为在类加载时期被初始化过一次,此后不会再被初始化,所以保证了单例。

欢迎大家关注我左侧的微信公众号,致力于Android知识,技术,心得等的分享与交流。并提供Android学习的路线与思维导图。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值