原文出处
http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822409.html
1.单例模式确保一个实例被创建,并且任意时刻都只有一个对象。它给了我们一个全局的访问点,又屏蔽了全局变量的缺点。可以被用来管理共享资源,比如数据库连接或线程池。特征是构造函数为私有,然后声明一个私有静态成员作为类对象,对外提供一个静态类方法创建该对象,在创建对象时会先判断是否已经创建,若是则直接返回已经创建的对象,若没有则创建新对象。
2.经典的单例模式如下:
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}
这个是线程不安全的,因为在同一时刻可能两个线程都进入了getInstance中创建新的Singleton,导致唯一性不能保证。
3.多线程安全的单例模式如下:
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}
使用一个synchronized 限定符对创建实例的方法进行同步,可以完成线程安全的需求,但是若已经创建后则同步这一动作是多余且降低效率的。若程序对这部分的效率不关注则使用该方法即可。
4.若总是使用该单例模式,则可以使用“急切”方式进行单例模式调用,利用了JVM加载类时会马上创建该实例的特性,这保证了线程安全,但是这又有和全局变量一样的问题——若这个对象耗资源很大,而程序在执行中又一直没有使用它,那么就造成了资源浪费:
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return uniqueInstance;
}
}
5.一个比较周全的方式是用“双重检查加锁”的方式减少同步次数的同时又线程安全。注意JAVA5前不支持volatile关键字。
public class Singleton {
private volatile static Singleton uniqueInstance;//volatile 确保当uniqueInstance初始化为Singleton的实例时,多个线程可以正确的处理uniqueInstance变量。
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {//只有第一次才会执行这里面的代码。也就是说第一次为同步,后来就是不作为了——这就是我们要的效果。
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
6.注意事项:
1)单例类不能被继承,因为Java中私有构造方法的无法扩展类。
2)和全局变量相比的优缺点,请参照“急切”和“延迟”两种单件模式实现的方式进行类比分析。
3)若使用多个类加载器,则可能导致单例失效。
相关推荐
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...
《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...
《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式的基础理论和实际应用。设计模式是软件开发中的经验总结,它为解决常见的编程问题提供了标准的解决方案,使得代码更具可读性、...
通过以上对“Head First设计模式”书中可能涉及的设计模式的介绍,我们可以看出这本书是学习面向对象设计模式的绝佳资源。无论是初学者还是有一定经验的开发人员,都能从中受益匪浅。理解并熟练运用这些模式能够帮助...
近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二...
最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二...
2. 设计模式:`《Head First 设计模式》代码之PHP版.txt` 提到了设计模式的概念,这是软件工程中的一种经验总结,用于解决常见的编程问题。PHP程序员可以通过学习设计模式来提升代码结构和可重用性,例如工厂模式、...
8. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式,提升代码质量和可维护性。 9. **JVM原理**:理解Java虚拟机的工作方式,包括内存管理、垃圾回收机制等。 10. **Spring框架**:掌握流行的...
项目中的笔记可能还包括了《Head First Java》的解析,这是一本非常适合初学者的书籍,它以直观易懂的方式讲解Java,帮助初学者快速掌握编程基础。通过阅读笔记,你可以了解如何使用IO流进行文件操作,以及如何使用...