JAVA 之 七种单例模式
1、饿汉式单例类
class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return instance;
}
}
2、懒汉式单例类
class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
synchronized public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
或者
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
instance = new LazySingleton();
}
}
return instance;
}
3、双重检查锁定-懒汉式单例
class LazySingleton {
private volatile static LazySingleton instance = null;
private LazySingleton() { }
public static LazySingleton getInstance() {
//第一重判断
if (instance == null) {
//锁定代码块
synchronized (LazySingleton.class) {
//第二重判断
if (instance == null) {
instance = new LazySingleton(); //创建单例实例
}
}
}
return instance;
}
}
4、Initialization Demand Holder (IoDH)静态内部类之单例模式
class Singleton {
private Singleton() {
}
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
}
IoDH可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。
5、序列化和反序列化 -- 单例模式
public class SingletonTwo implements Serializable{
/**
* 序列化与反序列化方式
*/
private static final long serialVersionUID = 1L;
private static class SingletonHan{
private static final SingletonTwo single = new SingletonTwo();
}
private SingletonTwo(){}
public static SingletonTwo getInstance(){
return SingletonHan.single;
}
/**
* 反序列化接口
* @return
* @throws ObjectStreamException
*/
protected Object readResolve() throws ObjectStreamException{
return SingletonHan.single;
}
}
6、使用static代码块
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
/**
* 静态代码块实现
*/
static{
instance = new Singleton();
}
public static Singleton getInstance(){
return instance;
}
}
7、使用enum枚举数据类型
/**
* enum枚举实现单例模式
* @author MIXCS
*
*/
public class SingletonEnum {
public enum EnumSingle{
singleton;
private SingletonEnum instance;
private EnumSingle(){
instance = new SingletonEnum();
}
public SingletonEnum getSingele(){
return instance;
}
}
public static SingletonEnum getInstance(){
return EnumSingle.singleton.getSingele();
}
}

浙公网安备 33010602011771号