基于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...
单例模式的实现有多种方式,如饿汉式初始化、静态块初始化、懒汉式初始化、线程安全的单例、Bill Pugh实现方式和枚举实现方式。例如,EagerInitialization是饿汉式初始化的实现,它在类加载时就立即创建单例对象。...
FindBugs由比尔·派珀(Bill Pugh)创建并维护,其设计目标是通过分析字节码来检测可能的错误,而非源代码。这种分析方式使得FindBugs不仅适用于未编译的源代码,而且对已编译的类文件也同样有效。FindBugs的检测...
资源分类:Python库 所属语言:Python 资源全名:pugh_torch-0.3.0-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
本文主要探讨了基于AHP-PUGH方法的儿童陪伴机器人设计评价研究,旨在通过科学的评价体系选择最优设计方案,以满足日益增长的儿童教育市场需求。儿童陪伴机器人作为服务机器人的一种,专注于语音交互、视频通话、儿童...
FindBugs始于2003年,由University of Maryland的Bill Pugh领导开发。它通过分析Java字节码,而非源代码,来查找可能存在的问题,如空指针异常、未初始化的对象引用、资源泄露等。3.0版本是FindBugs的一个重要里程碑...
4. **枚举 Singleton**:这是 Bill Pugh 提出的一种创建 Singleton 实例的方法,既能防止反序列化重新创建新的实例,又避免了同步问题。代码如下: ```java public enum Singleton { INSTANCE; public void ...
《敏捷技能修炼:敏捷软件开发与设计的最佳实践》是由Alan Shalloway、Scott Bain、Ken Pugh和Amir Kolsky四位世界顶级软件开发专家和敏捷导师共同编著的一本经典著作。本书深入探讨了敏捷开发的核心理念和技术实践...
在实践中,我们需要对XSLT的工作原理有一定的了解,包括选择符(XPath)、模式匹配、模板规则和变量等概念。此外,熟悉XML和DocBook的语法规则是必不可少的,因为XSLT是基于XML的,并且直接操作XML文档的结构。 ...
《Solr 1.4企业级搜索服务器》深入探讨了Solr的各种高级功能,为读者提供了丰富的实践案例和最佳实践。无论是对于希望提升现有搜索系统的性能和功能的开发者,还是对于那些正在寻找企业级搜索解决方案的决策者,本书...
- **技术架构师/设计师**:深入到具体的技术实现细节,包括代码规范、架构设计模式等。 **架构师的素质要求** - **技术深度与广度**:拥有广泛的技术知识和深厚的专业技能。 - **问题解决能力**:面对复杂问题时...
在“classwork-pugh-kyara:人才之路队列12课堂回购”这个项目中,我们聚焦于Java编程语言的学习和应用。这个标题暗示了这是一个关于教育或培训的项目,可能是一个课程作业或者团队协作练习,旨在提升学员们对Java...
模式设计经典书籍 ken pugh 全力打造 多年设计的经验
matlab换手率代码温带和寒带森林人口统计资料和碳周转的人为烙印 作者 瑞典隆德大学的Thomas AM Pugh,慕尼黑工业大学的...cluster_assignment.R,使用多模式模型将干扰活动性群集映射到特征/气候 文件夹:ESA_processi
跳表(Skip List)是一种高效的查找数据结构,它利用了概率算法来提高查询效率,通常用于数据库和搜索引擎中。在C++中实现跳表,我们可以利用STL中的容器和算法库来简化工作,同时理解其背后的原理至关重要。...
《Java Memory Model》是一篇关于Java内存模型的重要论文,由Jeremy Manson、William Pugh以及Sarita V. Adve共同撰写。该论文主要介绍了Java 5.0版本中更新后的Java内存模型(JMM),并详细阐述了它在多线程程序中...
结果:根据这项研究,从Child-Pugh分类的角度来看,最高的维生素D水平在Child-Pugh A类中具有最高的价值,以供血不足的形式出现的频率为13(43%),并且最高在Child-Pugh B和C类中的价值略有不足。 结论:根据研究...
例如,《Prefactoring》一书的作者Ken Pugh,对本书给予高度评价,认为Jim Shore和Shane Warden的专业解释和实践建议来源于他们丰富的团队领导经验。他指出,书中不仅涉及了实践的技巧,还包括了建立信任和团队凝聚...