单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
单例模式分为两种:
懒汉式(实例延迟加载模式)和饿汉式
/**
* 单线程环境下的饿汉式单例模式
* @author ywq
*
*
*/
class Single{
private static final Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
/**
* 单线程环境下的懒汉式单例模式
* @author ywq
*
*
*/
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(null==s)
s = new Single();
return s;
}
}
/**
* 多线程环境下的懒汉式单例模式(简单加锁)
* @author ywq
*
*
*/
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
synchronized(Single.class){
if(null==s)
s = new Single();
}
return s;
}
}
/**
* 多线程环境下的懒汉式单例模式(DCL,双检锁实现)
* 由于指令可能重排序,即DCL可能会返回一个并不完整的对象。
* @author ywq
*
*
*/
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(null==s){
synchronized(Single.class){
if(null==s)
s = new Single();
}
}
return s;
}
}
/**
* 多线程环境下的懒汉式单例模式(DCL,双检锁+volatile实现)
* 加入了volatile变量来禁止指令重排序
* @author ywq
*
*
*/
class Single{
private static volatile Single s = null;
private Single(){}
public static Single getInstance(){
if(null==s){
synchronized(Single.class){
if(null==s)
s = new Single();
}
}
return s;
}
}
/**
* 多线程环境下的懒汉式单例模式(基于静态内部类实现)
* @author ywq
*
*
*/
class Single{
private Single(){}
private static class Inner{
final static Single s = new Single();
}
public static Single getInstance(){
return Inner.s;
}
}