基于Steve Quirk早先的工作,Bill Pugh实现了了一个适合所有版本的JVM、性能良好且线程安全的单例。此实现是依靠JVM对内部静态类&静态成员初始化的顺序(非并行)机制来实现的。
class Singleton { private Singleton() { } private static class LazySingleton { public static Singleton singleton = new Singleton(); } public static Singleton getInstance() { return LazySingleton.singleton; } }
该设计的执行流程是:
(1) 当JVM加载Singleton时,类Singleton首先进行初始化,由于该类并没有任何静态
变量需初始化,所以初始化过程很快完成。
(2) 直到JVM决定LazySingleton必须执行时,定义在Singleton中的静态内部类
LazySingleton才会初始化,也就是Singleton中的静态方法getInstance()被调用时,LazySingleton才会初始化。
(3) JVM第一次加载并初始化LazySingleton时,静态变量instance通过执行外部类
Singleton的私有构造函数而初始化。由于在JLS(Java Language Specification)中定义内部类初始化阶段是线性的、非并发的(serial, non-concurrent),所以无需再在静态的getInstance()方法中指定任何synchronized锁。
(4) 由于在类的初始化阶段,是以一种线性操作方式来写(而非无序访问)静态变量
singleton,(原文是writes the static variable singleton in a serial operation),所有对getInstance()后续的并发调用,将返回同样正确初始化的instance,而不会导致任何额外的同步负载。
一个测试例子:
步骤:
1 构造函数设置为private的
2 设置一个static类型的private的内部类,只有一个private的 static的 字段instance--单列的唯一实例
3 在static的getInstance方法中,返回2中的内部类的static字段instance--单列的唯一实例
public class TestSingleton { //构造函数 private private TestSingleton() { } //private 的静态内部类(static内部类) private static class LazySingleTon { //静态字段,类TestSingleton的唯一实例 private static TestSingleton singletonIntance = new TestSingleton(); } //获取单例的方法 public static TestSingleton getInstance() { return LazySingleTon.singletonIntance; } //单例的一个测试方法 public void testSingletonMethod() { System.out.println("testSingletonMethod() "); } public static void main(String[] args) { TestSingleton onlyOne = getInstance(); //获取单例 onlyOne.testSingletonMethod(); //执行单例方法 } }
相关推荐
it his highly recommendable to study this work of the computer expert Goldstine who provides an authoritative insight into the field of computer developments with focus on the scientific fundamentals...
资源分类:Python库 所属语言:Python 资源全名:pugh_torch-0.3.0-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
慢性乙型肝炎肝脏磁共振31磷波谱与Child-Pugh分级的对照研究,吴苾,宋彬,目的 磁共振31磷波谱(31P Magnetic Resonance Spectroscopy ,31P-MRS)是一种可用作研究活体肝脏的细胞水平的能量代谢和生化指标变化的非...
#资源达人分享计划#
NULL 博文链接:https://gogo1217.iteye.com/blog/1961276
模式设计经典书籍 ken pugh 全力打造 多年设计的经验
classwork-pugh-kyara:人才之路队列12课堂回购
Pugh CC-真正的数学分析-第一版 Rudin W.-数学分析原理-第三版 Apostol TM-数学分析-第二版 实物分析2 像教授一样强硬。 谢里夫工业大学的Ranjbar Motlagh在21-22Spring学期 补充资源: Pugh CC-真正的数学分析-...
matlab换手率代码温带和寒带森林人口统计资料和碳周转的人为烙印 作者 瑞典隆德大学的Thomas AM Pugh,慕尼黑工业大学的...cluster_assignment.R,使用多模式模型将干扰活动性群集映射到特征/气候 文件夹:ESA_processi
skiplist 跳表C++实现,资料参考 en.wikipedia.org/wiki/Skip_list
结果:根据这项研究,从Child-Pugh分类的角度来看,最高的维生素D水平在Child-Pugh A类中具有最高的价值,以供血不足的形式出现的频率为13(43%),并且最高在Child-Pugh B和C类中的价值略有不足。 结论:根据研究...
跳表是由William Pugh发明。他在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists: a probabilistic alternative to balanced trees,在该论文中详 细解释了跳表的数据结构和插入删除操作。
FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。 代码质量工具的一个问题是它们容易为...
基于Child Pugh评分,单因素分析用于确定预后因素。 结果:43例患者中,男32例,女11例,平均年龄52±9.5岁。 乙型病毒性肝炎是最常见的病因(39.5%)。 儿童Pugh阶段C被发现为60.5%。 93%的病例存在食管静脉曲...
肝硬化被分类为Child-Pugh B(占47%)和Child-Pugh C(占35%)。 病因是病毒B型75例(91.5%),BD合并感染2例,酒精中毒1例。 胃-十二指肠内窥镜检查的适应症是系统性搜索门脉高压征象的66例(80.4%),上消化...
由开发Remel Pugh ( )执照 Copyright (c) 2014 Remel PughPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), ...
多数患者(78.2%)为儿童Pugh得分B,21.7%为儿童Pugh得分C。67.39%的患者患有糖尿病。 50%的病例存在门静脉血栓形成。 在56.52%的病例中,甲胎蛋白升高> 400。 三十四名患者接受了化疗形式的治疗,而十二名...
Pugh开发的决策算法。 这样做的目的是在Fish4Knowledge(F4K)数据集中删除大量误报鱼检测结果,而又不会丢失太多的True Positives。 内容 run______.py处理的每个阶段的mpi脚本。 f4klib.py包含提取和处理所需的...
JSR133 FAQ 中文版,原文地址:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
FindBugs 的设计者 David Hovemeyer 和 William Pugh 注意到了这个问题,并努力减少他们所报告的伪问题数量。与其他静态分析工具不同,FindBugs 不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题