在Java编程中,单例模式是最常见的设计模式,在程序运行时,整个系统中某种类型限制只能有一个实例对象。
在实际编程中,单例模式实现方式可分为两类
一、饿汉式
1.使用静态变量,并在类加载时初始化实例对象,不存在多线程安全问题
public class Singleton
{
private static final Singleton INSTANCE = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return INSTANCE;
}
}
2.使用枚举,最简单的饿汉式实现方法
public enum Singleton
{
INSTANCE;
}
3.使用静态变量,并在静态代码块中初始化实例对象
public class Singleton
{
private static final Singleton INSTANCE;
static
{
INSTANCE = new Singleton();
}
private Singleton()
{
}
public static Singleton getInstance()
{
return INSTANCE;
}
}
二、懒汉式
上面的饿汉式实现方式,无论是否需要实例对象,都事先创建好,占用了一定的内存空间,而懒汉式则在真正使用实例对象时才创建对象,减少系统启动时占用的资源
1.在静态方法中初始化实例对象,存在多线程安全问题
public class Singleton
{
private static Singleton INSTANCE;
private Singleton()
{
}
public static Singleton getInstance()
{
if (null == INSTANCE)
{
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
2.同样在静态方法中初始化实例对象,并使用同步锁,解决多线程安全问题
public class Singleton
{
private volatile static Singleton INSTANCE;
private Singleton()
{
}
public static Singleton getInstance()
{
if (null == INSTANCE)
{
synchronized (Singleton.class)
{
if (null == INSTANCE)
{
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
3.使用内部类,在内部类被使用加载时才创建实例对象,同样解决了多线程安全问题
public class Singleton
{
private Singleton()
{
}
public static Singleton getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
private static final Singleton INSTANCE = new Singleton();
}
}