package singleton;
/**单例设计模式 饿汉式
*
* @author gx
*这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,
*虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,
* 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
* 这时候初始化instance显然没有达到lazy loading的效果。
*/
public class Ehan {
private static Ehan instance=new Ehan();
private Ehan(){}
public static Ehan getInstance(){
return instance;
}
}
package singleton;
/**单例设计模式饿汉式 变种
* 类初始化即实例化instance。
* @author gx
*
*/
public class EhanVarietal {
private static EhanVarietal instance=null;
static{
instance=new EhanVarietal();
}
private EhanVarietal(){}
public static EhanVarietal getInstance(){
return instance;
}
}
package singleton;
/**
* 单例设计模式懒汉式,线程不安全
* @author gx
* 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
*/
public class LanHan {
private static LanHan instance;
// 私有构造方法
private LanHan() {
}
// 提供公有的外部构造方法
public static LanHan getInstance() {
if (instance != null) {
instance = new LanHan();
}
return instance;
}
}
package singleton;
/**单例设计模式 懒汉式 线程安全
*
* @author gx
* 这种写法能够在多线程中很好的工作,
* 而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
*/
public class LanHanSafety {
private static LanHanSafety instance;
private LanHanSafety(){}
public static synchronized LanHanSafety getInstance(){
if(instance==null){
instance=new LanHanSafety();
}
return instance;
}
}
package singleton;
/**单例设计模式 枚举类型
*
* @author gx
*
*/
public enum MeiJu {
INSTANCE;
private String name;
private int age;
private MeiJu(){}
public void whateverMethod(){}
public static MeiJu getInstance(){
return INSTANCE;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name+"-----"+this.age;
}
}
package singleton;
/**单例设计模式 静态内部类
*
* @author gx
*
*/
public class StaticInnerClass {
private static class StaticInnerClassHolder{
private static final StaticInnerClass INSTANCE=new StaticInnerClass();
}
private StaticInnerClass(){}
public static StaticInnerClass getInstance(){
return StaticInnerClassHolder.INSTANCE;
}
}
package singleton;
/**
* 单例设计模式 双重验锁
*
* @author gx
*
*/
public class YanSuo {
private volatile static YanSuo instance;
private YanSuo() {
}
public static YanSuo getInstance() {
if (instance == null) {
synchronized (YanSuo.class) {
if (instance == null) {
instance = new YanSuo();
}
}
}
return instance;
}
}