单例模式

1.关于双检测锁定DCL的问题

public class SingletonKerriganD {     

    /**   
     * 单例对象实例   
     */    
    private static SingletonKerriganD instance = null;     

    public static SingletonKerriganD getInstance() {     
        if (instance == null) {     
            synchronized (SingletonKerriganD.class) {     
                if (instance == null) {     
                    instance = new SingletonKerriganD();     //A
                }     
            }     
        }     
        return instance;     
    }     
}    

A处的代码的汇编大致执行如下几步
1.分配内存
2.初始化
3.变量指向这个内存
在java上由于支持处理器乱序执行,2和3的顺序是不定的,假如3先执行了,那么第二个线程在访问的时候会因为变量不为空直接返回,但这时还没有初始化,所以可以遇见的一定会报错。
在c语言中是可行的,在java1.5以后呢引入了volatile ,volatile修饰的变量,保证每次都从堆中读取,保证在2,3没有完全执行完的时候不会有人可以访问到他。会影响一定的效率

那么可以采用内部静态类的方式。

public class SingletonKerrigan implements Serializable {     

    private static class SingletonHolder {     
        /**   
         * 单例对象实例   
         */    
        static final SingletonKerrigan INSTANCE = new SingletonKerrigan();     
    }     

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

    /**   
     * private的构造函数用于避免外界直接使用new来实例化对象   
     */    
    private SingletonKerrigan() {     
    }     

    /**   
     * readResolve方法应对单例对象被序列化时候   
     */    
    private Object readResolve() {     
        return getInstance();     
    }     
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.单例模式概述 (1)引言 单例模式是应用最广的模式之一,也是23种设计模式中最基本的一个。本文旨在总结通过Ja...
    曹丰斌阅读 3,005评论 6 47
  • 单例模式的实现 单例模式的实现一般来说有2种方式:懒汉式(延迟加载)、饿汉式(非延迟加载)。 1. 饿汉式(非延迟...
    JerryL_阅读 980评论 0 3
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,298评论 4 34
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,539评论 1 8
  • 一.什么是单例模式 单例模式的定义:确保一个类只有一个实例,并提供一个访问他的全局访问点。单例模式是几个设计模式中...
    Geeks_Liu阅读 2,244评论 0 10