单例模式(Java)

线程安全的饿汉模式(强烈推荐)

public class Singleton {
    private Singleton(){}
    private static final Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

private static final Singleton instance = new Singleton();为什么要用static,因为getInstance方法是static的(不用生成实例就能使用),静态方法只能调用静态成员,在类初始化时就实例化instance

线程安全的懒汉模式

public class Singleton {//双重校验的懒汉,且线程安全
    private Singleton(){}
    private volatile static Singleton instance;(加volatile防止指令重排序)
    public static Singleton getInstance(){
        if(instance == null){//加锁效率低,在已经生成实例后,没必要再判断锁
            synchronized(Singleton.class){//加锁,防止多线程时,生成多个实例
                if(instance == null){
                    instance = new Singleton();指令重排序,先完成赋值,但构造函数还没执行完
                }
            }
        }
        return instance;
    }   
}

private volatile static Singleton instance;添加volatile关键字的原因:

instance = new Singleton();指令重排序,先完成赋值,但构造函数还没执行完。

instance = new Singleton();可以分解为3行伪代码

  1. memory=allocate();// 分配内存 相当于c的malloc
  2. ctorInstanc(memory) //初始化对象
  3. instance=memory //设置instance指向刚分配的地址

上面的代码在编译器运行时,可能会出现重排序 从1-2-3 排序为1-3-2
如此在多线程下就会出现问题
例如现在有2个线程A,B
线程A在执行第5行代码时,B线程进来,而此时A执行了 1和3,没有执行2,此时B线程判断instance不为null 直接返回一个未初始化的对象,就会出现问题
而用了volatile,上面的重排序就会在多线程环境中禁止,不会出现上述问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 单例:意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单...
    CoderZS阅读 3,704评论 1 13
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,496评论 11 349
  • 单例模式 转载原文链接-张新强 [TOC] 单例对象的类必须保证只有一个实例存在 懒汉式:指全局的单例实例在第一次...
    Briarbear阅读 1,715评论 1 0
  • 前言 java 常见的单例模式有三种: 懒汉: getInstance的时候实例化; 饿汉: 引用AA类的时候实例...
    叽哩叽哩鸡阅读 3,698评论 0 3
  • 1月15日精进 今日体验:不管在干什么话的同时 首先要找自己的不足 只有找到了 才能慢慢的成长 慢慢的熟练 顺力...
    小璇_c390阅读 1,882评论 0 0

友情链接更多精彩内容