设计模式
参见:https://www.malaoshi.top/show_1EF2G0eIdaD3.html
单例模式
参见:https://www.malaoshi.top/show_1EF2G0eIdaD3.html
饿汉式 PK 懒汉式
1 、饿汉式在类加载时就创建实例, 第一次加载速度快; 懒汉式第一次使用时才进行实例化,第一次加载速度慢 饿汉式:空间换时间 懒汉式:时间换空间
2 、饿汉式线程安全;懒汉式存在线程风险
饿汉式(最简单)
创建对象实例的时候直接初始化
空间换时间
线程安全
public class SingletonHungary {
//1、创建类中私有构造
private SingletonHungary (){
}
//2、创建该类型的私有静态实例
private static SingletonHungary instance=new SingletonHungary ();
//3、创建公有静态方法返回静态实例对象
public static SingletonHungary getInstance(){
return instance;
}
}
懒汉式
类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
时间换空间
线程不安全
public class SingletonLazy {
//1、创建私有构造方法
private SingletonLazy(){
}
//2、创建静态的该类实例对象
private static SingletonLazy instance=null;
//3、创建开放的静态方法提供实例对象
public static SingletonLazy getInstance(){
/*
第一次调用时,instance为null,才创建对象
以后再调用,instance不为null,不创建对象,直接返回
*/
if(instance==null)
instance=new SingletonLazy();
return instance;
}
}
静态内部类(最优)
和饿汉模式一样,是靠JVM保证类的静态成员只能被加载一次的特点,这样就从JVM层面保证了只会有一个实例对象。
线程安全
class SingletonStaticInner {
private SingletonStaticInner() {
}
private static class SingletonInner {
private static SingletonStaticInner singletonStaticInner = new SingletonStaticInner();
}
public static SingletonStaticInner getInstance() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SingletonInner.singletonStaticInner;
}
}
与饿汉模式区别
加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
可以说这种方式是实现单例模式的最优解。
真实应用
JDK中的 Runtime 类
练习
多选题 单例模式的实现必须满足()个条件。(选择三项)
A 类中的构造方法的访问权限必须设置为私有的
B 类中的构造方法必须用protected修饰
C 必须在类中创建该类的静态私有对象
D 在类中提供一个公有的静态方法用于创建、获取静态私有对象
多选题 下列关于懒汉式和饿汉式的说法错误的是()(选择两项)
A 饿汉式在第一次使用时进行实例化
B 懒汉式在类加载时就创建实例
C 饿汉式的线程是安全的
D 懒汉式存在线程风险
编程练习 某公司研发星球维护系统,请使用饿汉式单例模式的实现思想,设计编写地球类。