1.定义
确保一个类只有一个实例,并提供一个全局访问点。
包含一个私有的构造器,一个静态变量实例,一个静态方法获取实例。
最简单的,不考虑多线程编程,实现单例模式代码:
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
如果考虑多线程,则需要使用sychronized
public static sychronized Singleton getInstance(){
if(uniqueInstance == null ){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
可以接着改善多线程
使用“急切“创建,而不是“延迟”创建
public class Singleton {
public static Singleton uniqueInstance = new Singleton(); //在静态初始化器中创建单件,保证了线程安全。
private Singleton(){
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
也可以使用“双重检查加锁”,在getInstance()中减少使用同步
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() { }
public static Singleton getInstance() {
if(uniqueInstance == null) {
synchronized(Singleton.class) {
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
首先检查实例是否已经创建,如果尚未创建,才进行同步。这样一来,只有第一次会同步。