public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
/*
* 懒汉单例模式,线程不安全
*/
public static Singleton getInstanceLazy() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
/*
* 同步单例模式1,线程安全,浪费时间,需要判断同步锁
*/
public static synchronized Singleton getInstanceSync1() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
/*
* 同步单例模式2,线程安全,浪费时间,需要判断同步锁
*/
public static Singleton getInstanceSync2() {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
/*
* 双重校验单例模式,并发量不多,安全性不高的情况下使用,可能出现JVM编译过程中,指令重排的优化过程,导致
* 对象还没有初始化,就分配了空间,也就是说instance!=null,但是却没有初始化
*/
public static Singleton getInstanceDoubleSync() {
if (instance != null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
/*
* 内部类单例模式,线程安全,延迟加载,(内部静态类会延迟加载,即用到的时候再显示)
*/
private static class SingletonHolder {
private static Singleton singleton = new Singleton();
}
public static Singleton getInstanceInner(){
return SingletonHolder.singleton;
}
}
public enum SingletonEnum {
/**
* 1.从Java1.5开始支持;
* 2.无偿提供序列化机制;
* 3.绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候;
*/
instance;
private String others;
SingletonEnum() {
}
public void method() {
System.out.println("SingletonEnum");
}
public String getOthers() {
return others;
}
public void setOthers(String others) {
this.others = others;
}
}