单列模式:确保一个类只有一个实例,并提供一个全部访问点。单例模式主要应用于线程池、缓存中。单例模式主要有两种:懒汉模式和饿汉模式:
饿汉模式:
public class Singleton {
private static Singleton singleton=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
懒汉模式:
public class SluSigleton {
private static SluSigleton singleton=null;
private SluSigleton(){}
public static SluSigleton getInstance(){
if(null == singleton){
singleton=new SluSigleton();
}
return singleton;
}
}
上面的代码会有问题,并不能保证一定只有一个实例,需要改进
public class SluSigleton {
private static SluSigleton singleton=null;
private SluSigleton(){}
/**
* 多线程时,由于资源竞争,会导致创建多个实例,所以需要加锁
* 这样会造成一定的负担,每次请求都要同步
* @return
*/
public static synchronized SluSigleton getInstance(){
if(null == singleton){
singleton=new SluSigleton();
}
return singleton;
}
}
但是上面的代码会造成效率下降,可以对其进行改进
public class LockSigleton {
private volatile static LockSigleton sigleton;
private LockSigleton(){}
public static LockSigleton getInstance(){
if(null == sigleton){
synchronized (LockSigleton.class) {
if(null == sigleton){
sigleton=new LockSigleton();
}
}
}
return sigleton;
}
}
这个做法可以大大缩减getInstance()的时间。这个做法需要JDK在1.4以上。