单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。常见的单例模式有以下几种实现方法
3.
4.
5.
1.饿汉式单例类
特点:类加载时就初始化
实现代码如下:
public class SingletonTest {
public static void main(String[] args){
Singleton singleton = Singleton.newInstance();
Singleton singleton2 = Singleton.newInstance();
System.out.println(singleton==singleton2);
}
}
class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){
}
/*
这个地方使用static的原因:因为这里的构造函数是私有的,外界不能调用,因此不能生成对象,从而不能调用实例方法
因此需要加上static,从而可以不需要使用对象去访问该实例方法,用类就可以直接访问
*/
public static Singleton newInstance(){
return singleton;
}
}
运行结果是 true
Java语言中的单例类的一个最重要的特点是类的构造方法是私有的,从而避免外界利用构造方法直接创建实例。
2.懒汉式单例类
特点:第一次调用才初始化,延迟
class LazySingleton{
private static LazySingleton singleton;
private LazySingleton(){
}
public static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
3.
静态内部类
优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
class InternalSingleton{
private static class SingletonHolder{
private final static InternalSingleton INSTANCE=new InternalSingleton();
}
private InternalSingleton(){}
public static InternalSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
4.
枚举
优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
。
enum EnumSingleton{
INSTANCE;
public void doSomeThing(){
}
}
5.
双重校验锁
特点:在当前的内存模型中无效
class LockSingleton{
private volatile static LockSingleton singleton;
private LockSingleton(){}
public static LockSingleton getInstance(){
if(singleton==null){
synchronized(LockSingleton.class){
if(singleton==null){
singleton=new LockSingleton();
}
}
}
return singleton;
}
}