博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重学设计模式(二)—— 单例模式
阅读量:4223 次
发布时间:2019-05-26

本文共 2599 字,大约阅读时间需要 8 分钟。

单例模式,顾名思义,就是确保一个类只有一个实例,并提供一个全局访问点。

public class BasicSingleton {    private static BasicSingleton instance;    private BasicSingleton(){}    public static BasicSingleton getInstance(){        if(null == instance)            instance = new BasicSingleton();        return instance;    }}

上述代码算是最原始的单例模式实现,俗称懒汉模式,通过将构造方法私有化实现拒绝外部创建该类实例,同时开放一个静态方法返回一个全局唯一的实例对象。

仔细分析,上述代码中判断实例对象是否为空的条件之处在多线程环境下会存在线程安全的问题,对象可能会被重复创建,那如果事先就创建好相应单例对象实例,线程安全的问题就可以解决了,这便是饿汉模式单例。

public class HungrySingleton {    private static HungrySingleton instance = new HungrySingleton();    private HungrySingleton() {        if(null != instance){            throw new RuntimeException("单例模式被破坏");        }        System.out.println("HungrySingleton 私有构造方法");    }    public static HungrySingleton getInstance(){        return instance;    }}

实例对象instance在类加载的时候便会被创建,因此在使用静态方法获取单例对象实例的时候不会有线程安全的问题。

当然,我们也可以对上述的懒汉模式稍作修改,使用线程同步的方法实现线程安全,这就是DCL双检查锁模式。

public class DCLSingleton implements Serializable{
private static volatile DCLSingleton _instance; private DCLSingleton(){ synchronized (DCLSingleton.class){ if(null != _instance){ throw new RuntimeException("单例模式被侵犯!"); } } } public static DCLSingleton getInstance(){ if(null == _instance){ synchronized (DCLSingleton.class){ if(null == _instance){ _instance = new DCLSingleton(); return _instance; } } } return _instance; }}

这里有两个地方需要注意,一个是实例对象instance使用volatile关键字修饰,保证任何修改能马上被线程感知,同时使用synchronized关键实现代码同步,保证线程安全。

Java规范中规定,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,由此可知,枚举天生保证序列化单例。

public class EnumSingleton {    private enum SingletonEnum{        singletonFactory;        private Singleton instance;        SingletonEnum(){            this.instance = new Singleton();        }        public Singleton getInstance() {            return instance;        }    }    public static Singleton getInstance(){        return SingletonEnum.singletonFactory.getInstance();    }}class Singleton{    public Singleton(){        System.out.println("Singleton的构造方法");    }}

当然,最后我们还可以通过内部类的方法实现单例模式。

public class InnerClassSingleton implements Serializable{
private static class Singleton{
private static final InnerClassSingleton _instance = new InnerClassSingleton(); } private InnerClassSingleton(){ if(null != Singleton._instance){ throw new RuntimeException("单例模式被侵犯"); } } public static InnerClassSingleton getInstance(){ return Singleton._instance; }}

转载地址:http://kpgmi.baihongyu.com/

你可能感兴趣的文章
函数入栈出栈以及栈帧
查看>>
从RTTI谈C++的向下转型
查看>>
面试心得(BAT)
查看>>
Windows Server 2012 Web方式修改域用户密码-通过Remote Desktop Web实现
查看>>
华为USG5300 采用IKE安全策略方式建立IPSec隧道
查看>>
Centos7 nginx访问日志文件割接
查看>>
我是一条内存!
查看>>
OIM API Usage
查看>>
OIM实现OIM用户修改、OIM用户Disable流程审批
查看>>
UEFI与MBR区别
查看>>
Ubuntu每次开机后提示:检测到系统程序出现问题的解决方法
查看>>
CC2640 看门狗配置
查看>>
linnux外网不通,提示Destination Host Unreachable解决
查看>>
为strawberry perl安装PadWalker
查看>>
Notepad++的字体设置加Consolas和微软雅黑混合字体
查看>>
gdb 调试常用命令
查看>>
POJ 3125 (Queue)
查看>>
trees in a row
查看>>
在VirtualBox中安装Ubuntu
查看>>
ubuntu mount cifs
查看>>