每日一题 为了工作 2020 0415 第四十四题
*单例设计模式
/**
* 单例设计模式
* 单例模式便是创建型设计模式的一种,它确保某一个类在系统中只有一个实例,并自行实例化,
* 同时向外部提供获取这个唯一实例的接口。从这段描述中,我们不难可以得到单例模式的三大特性:
* 1.单例类只有一个实例。
* 2.单例类必须自己实例化自己。
* 3.单例类需要向外提供实例。
* 实现一:立即加载 <==>“饿汉模式”
* 立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。
* 很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。
* “饿汉模式”的优缺点:
* 优点:实现起来简单,没有多线程同步问题。
* 缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,
* 从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,
* 静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
*/
public class Singleton {
//将自身对象实例化为一个属性 并利用static,final修饰
private static final Singleton instance = new Singleton();
//构造方法私有化
private Singleton(){}
//利用静态方法返回实例
public static Singleton getInstance(){
return Singleton.instance;
}
}
/**
* 单例构造模式
* 实现二:延迟加载 / “懒汉模式”
*
* 延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。
* 不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。
*“懒汉模式”的优缺点:
* 优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并
* 分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些
* 特定条件下会节约了内存。
* 缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
*/
public class SingletonTwo {
//将自身实例化对象设置为一个属性,并利用static修饰
private static SingletonTwo instanceTwo;
//构造方法私有化
private SingletonTwo(){}
//利用静态方法返回该类的实例化对象
public static SingletonTwo getInstanceTwo(){
// 线程不安全
// if (instanceTwo == null){
// instanceTwo = new SingletonTwo();
// }
// return instanceTwo;
// 线程安全
if (instanceTwo == null){
//加锁
//某个线程取得了类锁,实例化对象第二次检查instancdTwo的时候
//查看该类是否已经被实例化出来了,如果没有最终进行类的实例化
synchronized (SingletonTwo.class){
if (instanceTwo == null){
instanceTwo = new SingletonTwo();
}
}
}
return instanceTwo;
}
}