博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例实现的一种巧妙方式
阅读量:5886 次
发布时间:2019-06-19

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

hot3.png

        一般大家接触过的单例模式有懒汉式,饿汉式以及双重检查锁的方式来实现单例模式。其中懒汉式不是线程安全的。代码如下:

public class Singleton {		private Singleton(){}		private static Singleton singleton = null;	public static Singleton getInstance(){		if(singleton ==null ){			singleton = new Singleton();		}		return singleton;	}}
      懒汉式是典型的时间换空间,也就是每次获取实例都会先进行一次判断,当然如果没人调用的话则不会创建实例,节省了空间。而且懒汉式是线程不安全的。

       下面来看一下饿汉式实现单例的代码

public class Singleton {		private Singleton(){}		private static Singleton singleton = new Singleton();	public static Singleton getInstance(){		return singleton;	}}
      饿汉式显然是线程安全的,应为它在装载类的时候就已经初始化好了,而且装载类的时候不可能出现并发的情况。但是饿汉式是典型的空间换时间,,当类装载的时候就会创建实例,不管你用不用先创建好再说。每次调用的时候也就不需要判断了。节省了运行时间。

        当然,懒汉式也可以实现成为线程安全的的方法,就是在获取实例的方法上加入synchronized即可,但是这样一来降低了整个访问速度,而且每次都要判断,更好的一种方法就是双重检查加锁。先看代码:

public class Singleton {		private Singleton(){}		private volatile static Singleton singleton = null;	public static Singleton getInstance(){		if(singleton ==null ){			synchronized (Singleton.class) {				if(singleton ==null ){					singleton = new Singleton();				}			}		}		return singleton;	}}
         这种实现方式既可以实现线程安全的创建实例,而又不会对性能造成太大的影响,它只在第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。但是要注意的是,这次用到了一个关键字:volatile,volatie关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率并不是很高,因此一般建议,没有特别必要,不要使用,也就是说虽然可以使用双重加锁机制来实现线程安全的单例,但并不太建议频繁使用,可以根据情况选用。

        接下来就是你想看到的东西,哈哈反正我是很受教。其实很简单,前面饿汉式已经实现了线程安全的实现了实例的初始化工作,但是它在类加载的时候就创建了实例,同样我是解决了在类加载的时候不去初始化对象,这样是不是就可以解决了?看代码:

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

想不到的方案往往就是非常简单,用一个类级别的内部类去创建对象实例,这样一来,只要不使用到这个内部类,你就不会创建对象实例,从而同时实现延迟加载和线程安全。

        最后说一下单元素的枚举类型已经成为实现Singleton的最佳方法,关于枚举大家可以查看其它资料此处不再赘述。

转载于:https://my.oschina.net/hellojacob/blog/95977

你可能感兴趣的文章
Mellanox端到端InfiniBand网络助力欧洲超算中心
查看>>
《工业控制网络安全技术与实践》一2.3.1 可编程逻辑控制器
查看>>
用友优普携手秉钧网络打造完整闭环O2O方案
查看>>
展望网络安全未来 布局新兴信息技术
查看>>
《中国人工智能学会通讯》——11.71 在线多示例度量学习的结构化稀 疏表观模型...
查看>>
再谈多端适配
查看>>
选址攻略:数据中心选址要明了五大优势
查看>>
让计算变简单 | 信号高速路上,华为服务器是如何绕过那些“坑”的
查看>>
物联网快速发展 促进数据中心需要的爆炸性增长
查看>>
比自建 Hadoop 还便宜!云栖大会揭秘阿里云数加 MaxCompute
查看>>
《Web安全之机器学习入门》一 1.2 人工智能的发展
查看>>
谈3D打印技术在医疗行业的应用
查看>>
10 个最受欢迎的 Java 开发的 CMS 系统
查看>>
安全初创公司获百万风投资金的第一步:容器保护、人工智能和云安全
查看>>
与其说技巧不如叫它血泪史 路由器你真的会挑
查看>>
数据模型多了,应该怎么管?
查看>>
数据中心即使上云,硬件依然是关键
查看>>
云恶意软件是小题大做还是真的邪乎?
查看>>
数据的阴暗面:什么是暗数据?为什么暗数据很重要?
查看>>
网易2018校招内推编程题 彩色的砖块
查看>>