一、立即加载模式(饿汉模式)
/**
* 立即加载模式(饿汉模式)
*
* @author LZN
*
*/
public class SingleOne {
private static SingleOne singleOne = new SingleOne();
private SingleOne() {
// TODO Auto-generated constructor stub
}
/**
* 该方法保证在多线程中获取的是同一个对象
* 该方法缺点是不能有其他实例变量,因为getInstance()不是同步方法,会引起线程安全问题
*
* @return
*/
public static SingleOne getInstance() {
return singleOne;
}
}
二、延迟加载模式(懒汉模式)
/**
* 延迟加载模式(懒汉模式)
*
* @author LZN
*
*/
public class SingleOne {
// 懒汉模式(DCL双检查锁机制)
private volatile static SingleOne singleOneDCL = null;
private SingleOne() {
// TODO Auto-generated constructor stub
}
/**
* 采用DCL双检查锁机制,保证在多线程中获取的是同一个对象
*
* @return
*/
public static SingleOne getInstance() {
if (singleOneDCL == null) {
// 在此处处理一些准备工作
synchronized (SingleOne.class) {
if (singleOneDCL == null) {
singleOneDCL = new SingleOne();
}
}
}
return singleOneDCL;
}
}
三、静态内置类实现单例模式
/**
* 静态内置类实现单例模式
*
* @author LZN
*
*/
public class SingleOne {
private static class MyObjectHandler {
private static SingleOne singleOne = new SingleOne();
}
private SingleOne() {
// TODO Auto-generated constructor stub
}
/**
*
* @return
*/
public static SingleOne getInstance() {
return MyObjectHandler.singleOne;
}
}
四、利用静态初始化器实现单例模式
/**
* 利用静态初始化器实现单例模式
*
* @author LZN
*
*/
public class SingleOne {
private static SingleOne singleOne;
static {
singleOne = new SingleOne();
}
private SingleOne() {
// TODO Auto-generated constructor stub
}
/**
*
* @return
*/
public static SingleOne getInstance() {
return singleOne;
}
}
五、使用enum枚举实现单例模式
/**
* 使用enum枚举实现单例模式
*
* @author LZN
*
*/
public class SingleOne {
public enum MyEnumSingle {
objectHandler;
private SingleOne singleOne;
private MyEnumSingle() {
// TODO Auto-generated constructor stub
System.out.println("SingleOne.MyEnumSingle.MyEnumSingle()");
singleOne = new SingleOne();
}
public SingleOne getInstance() {
return singleOne;
}
}
private SingleOne() {
// TODO Auto-generated constructor stub
}
/**
*
* @return
*/
public static SingleOne getInstance() {
return MyEnumSingle.objectHandler.getInstance();
}
}