`
godandghost
  • 浏览: 34376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java:单例模式的七种写法

阅读更多
转自:http://blog.csdn.net/magister_feng/article/details/6602756

第一种(懒汉,线程不安全):
public class Singleton {
	
	private static Singleton instance;
	private Singleton(){} 
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。

第二种(懒汉,线程安全):
public class Singleton {
	private static Singleton instance;
	private Singleton(){}
	public static synchronized Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。

第三种(饿汉):
public class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton(){}
	public static Singleton getInstance() {
		return instance;
	}
}

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。

第四种(饿汉,变种):
public class Singleton {
	private static Singleton instance = null;
	private Singleton(){}
	static {
		instance = new Singleton();
	}

	public static Singleton getInstance() {
		return instance;
	}
}


第五种(静态内部类):
public class Singleton {
	private static class SingletonHolder {
		private static final Singleton instance = new Singleton();
	}
	private Singleton(){}
	public static final Singleton getInstance() {
		return SingletonHolder.instance;
	}
}

这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。

第六种(枚举):
public enum Singleton
{
	INSTANCE;
	public void whateverMethod() {
	}
}

这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。

第七种(双重校验锁):
public class Singleton {
	private volatile static Singleton singleton;
	private Singleton(){}
	public static Singleton getSingleton() {
		if (singleton == null) {
			synchronized (Singleton.class) {
				if (singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

这个是第二种方式的升级版,俗称双重检查锁定,详细介绍请查看:http://www.ibm.com/developerworks/cn/java/j-dcl.html
分享到:
评论

相关推荐

    stm32网络远程固件升级keil5工程

    STM32 开发板:选择合适的 STM32 系列开发板,如 STM32F407、STM32F767 等,需具备足够的存储容量(用于存放固件)、网络接口(如以太网接口或可外接 WiFi 模块等实现网络连接)。 网络模块(可选): 如果开发板本身没有集成网络接口,需要外接网络模块。例如,可选用 ESP8266、ESP32 等 WiFi 模块通过 SPI、USART 等接口与 STM32 开发板连接,实现无线连接到网络。 若开发板有以太网接口,如 STM32F407 开发板带有以太网 MAC 控制器,还需外接以太网 PHY 芯片(如 DP83848 等)及相应的网络变压器等元件来实现完整的以太网功能。

    1-全国各省份、各地级市、各区县逐年平均降水数据(1950-2022年)-社科数据.zip

    全国各省份、各地级市、各区县逐年平均降水数据集提供了从1950年至2022年的详细降水记录。这些数据覆盖了广泛的地理区域,包括不同的气候带和地形,为研究中国各地区的降水模式提供了宝贵资料。该数据集包含了省级、城市级和区县级的降水量,以年为单位,记录了日降水总量的年平均值,单位为米(m)。这些数据对于理解各地区的水资源状况、农业灌溉需求、防洪措施的制定等方面至关重要,并且对地理研究和经济管理研究具有重要的参考价值。数据集包含了省份、城市、区县以及每年的降水量等指标,以面板数据格式呈现,方便进行多维度分析。

    [net毕业设计]ASP.NET网上鲜花销售系统的设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    2020年中国行政村级区划代码及经纬度 - 权威数据

    中国行政村级区划的经纬度数据,更是精准地描绘了每一个村落的地理位置。从北国的雪域高原到南疆的热带雨林,从东部的浩瀚大海到西部的广袤戈壁,每一个村落都以其独特的经纬度坐标,镶嵌在祖国的版图上。 指标 市级、市级代码、县级、县级代码、乡镇级、乡镇级代码、村级、村级代码、城乡分类代码、address、lng_84、lat_84。

    1-全国各省地区犯罪率统计数据1988-2020年-社科数据.zip

    全国各省地区犯罪率统计数据集提供了1988年至2020年的详细犯罪率数据,覆盖全国31个省份。这些数据通过刑事案件发生率来衡量社会犯罪率,为研究者提供了一个重要的社会犯罪变量测度。该数据集不仅记录了各省份每年的犯罪率,还包含了从1988年到2020年连续多年的统计数据,为分析犯罪趋势和模式提供了丰富的信息。此外,这些数据被广泛用于研究收入不平等与刑事犯罪之间的关系,以及其他社会经济因素对犯罪率的影响。通过这些数据,研究者可以深入探讨犯罪率与社会经济发展之间的联系,为制定相关政策提供科学依据。

    统计学课程设计报告说明.doc

    统计学课程设计报告说明.doc

    shell脚本编程实践,分享给有需要的人,仅供参考

    模拟退火算法shell脚本编程实践,分享给有需要的人,仅供参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    [net毕业设计]ASP.NET电子购物商城系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国高校专利申请量与授权量统计数据1985-2020年-社科数据.zip

    全国高校专利申请量与授权量统计数据集提供了1985年至2020年间中国高校在专利领域的详细统计信息。这些数据不仅记录了高校专利申请和授权的数量,还涵盖了专利的类型,包括发明专利、实用新型专利和外观设计专利。该数据集是衡量高校科技创新成效的重要指标,反映了高校科研成果转化的机制完善程度和科研人员转化积极性。数据内容丰富,包括高校名称、年度、独立及联合申请的各类专利数量,以及授权的专利数量等关键指标。这些统计数据有助于分析和评估高校的创新能力和科技成果转化效率,对于研究高校科技创新政策、管理决策以及发展趋势具有重要价值。

    spark中文文档,spark操作手册以及使用规范

    spark中文文档,spark操作手册以及使用规范

    yolo算法-车辆行人数据集-127张图像带标签-汽车-人.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    员工培训授训积分标准表.docx

    员工培训授训积分标准表.docx

    神经网络项目介绍.docx

    神经网络项目介绍

    [net毕业设计]ASP.NET学生信息管理系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    ASP物流管理系统设计(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    毕业设计心得.txtdfhfn

    毕业设计心得.txtdfhfn

    ASP+ACCESS人事管理系统设计(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各地区(省)人口相关统计面板数据1990-2021年-社科数据.zip

    全国各地区(省)人口相关统计面板数据集覆盖了1990至2021年的时间跨度,提供了全国31个省的详细人口统计信息。该数据集包含了常住人口数、年末常住人口、各年龄段人口数、受教育人口数、出生人口数、人口自然增长率、死亡率以及人口性别比例等多项指标。数据内容涉及0-14岁、15-64岁、65岁及以上的人口分布,以及6岁及以上按性别和教育程度划分的人口结构。此外,还包括了15岁及以上未婚人口数、市县总人口数、家庭户和集体户人口数等细分数据。这些数据不仅涵盖了人口的自然增长和减少情况,还包括了人口性别比、农业人口与非农业人口数、城镇与乡村人口比重等重要社会经济指标。通过这些数据,研究人员可以深入分析中国各地区的人口变化趋势,为政策制定和社会科学研究提供有力支持。

    降成本工作流程说明表.docx

    降成本工作流程说明表.docx

    13.html

    13

Global site tag (gtag.js) - Google Analytics