首先,介绍下单例模式 的基本构成:
1)私有的静态成员变量;
2)私有构造器;
3)公共静态方法返回成员变量实例;
1、一般写法(也就是所谓的饿汉式)
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
这是最简单的一种写法,线程安全,但为了避免有人进行如下操作,建议将成员变量设置为final。
Singleton s = Singleton.getInstance();
s = null;
s = null;
2、延迟加载(也就是所谓的懒汉式)
public class Singleton{
private static Singleton instance = null;
private static Singleton(){
}
public static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
这种写法是线程不安全的,如果保证线程安全则可以引申出下一种写法
3、延迟加载(线程安全)
public class Singleton{
private static Singleton instance = null;
private static Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
这种写法是线程安全的,但在方法上用synchronized效率会相对较慢,可以改进为代码块实现
public class Singleton{
private static Singleton instance = null;
private static Object lock = new Object();
private static Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
synchronized(lock){
instance = new Singleton();
}
}
return instance;
}
}
此外还有一种双重检测锁的形式
public class Singleton{
private static Singleton instance = null;
private static Object lock = new Object();
private static Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
synchronized(lock){
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
4、静态内部类方式
public class Singleton{
private static Singleton instance = null;
private static Singleton(){
}
static class SingletonHandler{
static instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHandler.instance;
}
}
这种方式是利用静态内部类的静态块为外部类的成员变量进行实例化,此种方式能够保证线程安全,同时又不会降低效率