1. 单例模式的定义
单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:
Ensure a class has only one instance, and provide a global point of access to it.
即确保只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式的通用类如下图所示:
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己new Singleton())。单例模式的通用代码如下(这种也称为饿汉式单例):
public class Singleton {
// 1.自己内部new一个
private static Singleton instance = new Singleton();
// 2.私有构造函数,防止被实例化
private Singleton() {
}
// 3.提供一个公共接口,用来返回刚刚new出来的对象
public static Singleton getInstance() {
return instance;
}
public void test() {
System.out.println("singleton");
}
}
2. 单例模式存在的线程安全问题
上面是一个经典的单例模式程序,且这个程序不会产生线程同步问题,因为类第一次加载的时候就初始化了instance。但是单例模式还有其他的实现方式,就有可能会出现线程同步问题,请看下面的例子:
/*
* 这种方式就是非线程安全了(懒汉式单例)
*/
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance == null) {