设计模式之单例模式

一、静态常量饿汉式

这种写法比较简单,就是在类装在的时候就完成了实例化。避免了线程同步的问题。缺点是,不能到达Lazy Lodaing的效果,如果从始至终都没使用过这个实例,就会造成内存的浪费。

//饿汉式(静态变量)

class Singleton {

	//1. 构造器私有化, 外部能new
	private Singleton() {

	}

	//2.本类内部创建对象实例
	private final static Singleton instance = new Singleton();

	//3. 提供一个公有的静态方法,返回实例对象
	public static Singleton getInstance() {
		return instance;
	}

}

二、静态代码块饿汉式

这种方式其实与静态常量饿汉式类似,只不过类的实例化放在静态代码块中,也就是类装载的时候就执行了静态代码块,初始化类的实例。

//饿汉式(静态变量)

class Singleton {

	//1. 构造器私有化, 外部能new
	private Singleton() {

	}


	//2.本类内部创建对象实例
	private  static Singleton instance;

	static { // 在静态代码块中,创建单例对象
		instance = new Singleton();
	}

	//3. 提供一个公有的静态方法,返回实例对象
	public static Singleton getInstance() {
		return instance;
	}

}

三、线程不安换懒汉式

class Singleton {
	private static Singleton instance;

	private Singleton() {}

	//提供一个静态的公有方法,当使用到该方法时,才去创建 instance
	//即懒汉式
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

四、线程安全懒汉式

// 懒汉式(线程安全,同步方法) 效率太低不推荐
class Singleton {
	private static Singleton instance;

	private Singleton() {}

	//提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
	//即懒汉式
	public static synchronized Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

五、双重检查

// 懒汉式(线程安全,同步方法)
class Singleton {
	private static volatile Singleton instance;

	private Singleton() {}

	//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题, 同时解决懒加载问题
	//同时保证了效率, 推荐使用

	public static synchronized Singleton getInstance() {
		if(instance == null) {
			synchronized (Singleton.class) {
				if(instance == null) {
					instance = new Singleton();
				}
			}

		}
		return instance;
	}
}

六、静态内部类

// 静态内部类完成, 推荐使用
class Singleton {
	private static volatile Singleton instance;

	//构造器私有化
	private Singleton() {}

	//写一个静态内部类,该类中有一个静态属性 Singleton
	private static class SingletonInstance {
		private static final Singleton INSTANCE = new Singleton();
	}

	//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE

	public static synchronized Singleton getInstance() {

		return SingletonInstance.INSTANCE;
	}
}

七、枚举方式

public class SingletonTest08 {
	public static void main(String[] args) {
		Singleton instance = Singleton.INSTANCE;
		Singleton instance2 = Singleton.INSTANCE;
		System.out.println(instance == instance2);

		System.out.println(instance.hashCode());
		System.out.println(instance2.hashCode());

		instance.sayOK();
	}
}

//使用枚举,可以实现单例, 推荐
enum Singleton {
	INSTANCE; //属性
	public void sayOK() {
		System.out.println("ok~");
	}
}

JDK中的java.lang.Runtime就是一个典型的饿汉式的单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值