单例模式:保证一个类只有一个实例,并只提供一个它的全局访问点。
1、饿汉模式
public class Singleton
{
private static Singleton instance = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return instance;
}
}
这种方式在加载时就完成了初始化,所以类加载比较慢,但获取对象的速度比较快。这种基于类加载的机制避免了多线程的同步问题。
2、懒汉模式
public class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton getInstance
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
懒汉模式申请了一个静态对象,在用户第一次调用的时候初始化,虽然节约了资源,但第一次加载时需要实例化反应稍微慢一些,而且在多线程的情况下不能使用。
3、懒汉模式(线程安全)
public class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static sychronized Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。
4、双重校验锁
public class Singleton
{
private volatile static Singleton instance;
private Singleton()
{
}
public static Singleton getInstance()
{
if(instance == null)
{
sychronized(Singleton.class)
{
if(instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
这种写法在getInstance方法中对instance进行了两次判空,第一次是为了不必要的同步,第二次是在instance等于null的情况下才创建实例。