// 经典的单件模式
public class Singleton {
private static Singleton uniqueInstance; // Singleton类的唯一实例
// 私有的构造器,只有该类内部可以调用
private Singleton() {}
// 唯一实例的全局访问点
public static Singleton getInstance() {
if(uniqueInstance == null) {
// 单件可以延迟实例化,对资源敏感的对象特别重要
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
// 多线程下的单件模式
// 1. getInstance()的性能对应用程序影响不大:直接用synchronized关键字修饰getInstance()
public class Singleton {
private static Singleton uniqueInstance; // Singleton类的唯一实例
// 私有的构造器,只有该类内部可以调用
private Singleton() {}
// 唯一实例的全局访问点
public static synchronized Singleton getInstance() {
if(uniqueInstance == null) {
// 单件可以延迟实例化,对资源敏感的对象特别重要
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
// 2. 应用程序总是创建单件实例/创建实例的负担不重:在静态初始化器中创建单件
public class Singleton {
private static Singleton uniqueInstance = new Singleton(); // Singleton类的唯一实例
// 私有的构造器,只有该类内部可以调用
private Singleton() {}
// 唯一实例的全局访问点
public static Singleton getInstance() {
return uniqueInstance;
}
}
// 3. 可以使用Java 1.5及以上版本:双重检查加锁(只有第一次会同步)
public class Singleton {
private volatile static Singleton uniqueInstance; // Singleton类的唯一实例
// 私有的构造器,只有该类内部可以调用
private Singleton() {}
// 唯一实例的全局访问点
public static Singleton getInstance() {
if(uniqueInstance == null) {
synchronized (Singleton.class) {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}