java中单例模式是一种常见的设计模式,单例模式的写法有多种,这里主要介绍6种写法:饿汉式单例、懒汉式单例3个、静态内部类,枚举。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
一.单例写法
<1>饿汉式单例
//饿汉式单例类.在类初始化时实例化
public class Singleton {
private Singleton() {}
private static final Singleton single = new Singleton();
//静态工厂方法
public static Singleton getInstance() {
return single;
}
}
此种方式在类加载的时候就初始化实例,没有达到懒加载的效果,但是,它是线程安全的
<2>懒汉式1
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
实现懒加载,不是线程安全的
<3>懒汉式2(同步方法)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
使用同步方法形式,实现懒加载和线程安全,但是效率很低,多数情况下并不需要同步。
<4>懒加载3(双重校验锁)
public class Singleton {
private static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
实现懒加载,线程安全,效率与同步方法形式有提高
<5>静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
这种比懒汉形式要好一些,既实现了线程安全,又避免了同步带来的性能影响。
<6>枚举形式
public enum Singleton {
INSTANCE;
//任意方法,调用时使用INSTANCE.方法名
public void whateverMethod() {
}
}
代码少,又实现了线程安全,又可避免反射破坏单例模式。
总结:还有一种登记式单例,以后学习。没有如果懒加载要求可使用饿汉式。线程安全懒加载使用静态内部类,涉及反序列化创建对象使用枚举。如果使用熟练枚举是个不错的选择,代码很简单。
二.java反射破坏单例:
http://blog.csdn.net/lws332969674/article/details/8125893
参考此链接,是否能保证唯一单例待验证。
备注:链接中防止破坏单例代码标志位flag设置有问题;