单例模式保证一个类中只有一个实例且该实例易于外界访问。
懒汉模式(实现了懒加载,不需要同步的情况下效率低)
public class SingletonClass{
private static SingletonClass instance=null;
public static synchronized SingletonClass getInstance()
{
if(instance==null)
{
instance=new SingletonClass();
}
return instance;
}
private SingletonClass(){
}
}
饿汉模式(基于classloder机制避免了多线程的同步问题)
public static class Singleton{
//在自己内部定义自己的一个实例,只供内部调用
private static final Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
懒汉模式和饿汉模式都是在类初始化即实例化instance
双重锁模式
public static class Singleton{
private static Singleton instance=null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null==instance){
instance=new Singleton();
}
}
}
return instance;
}
}
静态内部类(classloder的机制来保证初始化instance时只有一个线程,只有被调用的时候instance才会初始化,省资源)
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
枚举
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象