题目:设计一个类,我们只能生成该类的一个实例。
书上主要推荐三种写法:
1)加同步锁且前后两次判断实例是否存在
public class Singleton{
private static Object synObject = new Object();
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getInstance(){
if(singleton==null){
synchronied(synObject){
if(singleton==null){
singleton = new Singleton();//这一步
}
}
}
return singleton;
}
}
注:其实这个代码我在面试网易的时候,面试官说了应该对 实例变量再加一个修饰符:volatile,
是为了保证在多个线程访问单例变量时都有去主存,而不能私自使用cache,所以只要修改一行代码即可:
private static volatile Singleton singleton = null;
2)利用静态构造函数(推荐)
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
}
3)实现按需创建实例(推荐)
上面的利用静态构造函数唯一的缺点是类加载时就初始化了单例实例,下面按需创建实例:
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
//静态内部类
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
}