Singleton(单例):
包含一个自己的类实例的属性,并把构造方法用private关键字隐藏起来,对外只提供getInstance()方法以获得这个单例对象
除了“饿汉”与“懒汉”这2种单例模式,其实还有其他的实现方式。但万变不离其宗,它们统统都是由这2种模式发展、衍生而来的
饿汉示例代码:
/**
* 饿汉模式
*/
public class HungerSingleton {
private static final HungerSingleton instance = new HungerSingleton();
// 构造方法私有,不允许外部实例化对象
private HungerSingleton() {
}
// 对外暴露获取实例的方法
public static HungerSingleton getInstance() {
return instance;
}
}
懒汉单例示例代码
package com.azure.design.singleton;
/**
* 懒汉模式
*/
public class LazySingleton {
/**
* 变量的定义不再使用find关键字,这意味着它不再是常量,而是需要后续赋值的变量;
* 而关键字volatile对静态变量的修饰则能保证变量值在各线程访问时的同步性、唯一性
*/
private volatile static LazySingleton lazySingleton;
// 构造方法私有化,防止外部创建对象
private LazySingleton() {
}
/**
* 用了2个嵌套的判空逻辑,这就是懒加载模式的“双检锁”:
* 外层放宽入口,保证线程并发的高效性;
* 内层加锁同步,保证实例化的单次运行。
* 如此里应外合,不仅达到了单例模式的效果,还完美地保证了构建过程的运行效率,一举两得
* @return
*/
public static LazySingleton getLazySingleton() {
// 判断对象是否为空
if(lazySingleton == null) {
// 防止多线程进入
synchronized (LazySingleton.class) {
// 只有进入的第一个线程才可以创建对象
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}