目录
前言
- 该文章为Java基础自学笔记
- 其他内容:Java基础学习笔记目录
- 学习用书:
《Java核心技术 卷Ⅰ 基础知识(第10版)》
《Java经典编程300例》
第十六章 单例模式
16.1 设计模式(Design Pattern)
- 设计模式是一套被前人反复使用、多数人知晓、经过分类编目的代码设计经验的总结,后来者可以直接拿来解决问题
- 设计模式时软件设计中的常见解决方案,好的设计模式可以进一步提高代码的重用性
16.2 单例模式(Singleton Pattern)
- 可以保证系统中,应用该模式的类永远只有一个实例,即一个类永远只能创建一个对象
16.3 单例模式的场景和作用
- 如任务管理器对象,我们只需要一个就可以解决问题
- 节省内存空间
16.4 饿汉单例设计模式(多线程安全)
- 在用类获取对象的时候,对象已经提前创建好
16.4.1 饿汉单例模式设计步骤
- 定义一个类,把构造器私有
- 定义一个静态变量存储一个对象
16.4.2 饿汉单例模式特点
- 优点: 没有线程安全的问题
- 缺点: 浪费内存空间
16.4.3 饿汉单例模式代码
/**
* 饿汉单例模式
* 根据静态成员变量只加载一次的特性,控制类对象只有一个
* 饿汉:公有静态成员变量instance,在加载静态成员变量时创建类对象
*/
public class EagerSingleton {
// 公有的静态成员变量,在加载静态变量时创建类对象
public static EagerSingleton instance = new EagerSingleton();
// 私有构造器
private EagerSingleton() {
}
}
- 测试类
public class Test {
public static void main(String[] args) {
EagerSingleton s1 = EagerSingleton.instance;
EagerSingleton s2 = EagerSingleton.instance;
System.out.println(s1); // se.basics.singleton.EagerSingleton@49e4cb85
System.out.println(s2); // se.basics.singleton.EagerSingleton@49e4cb85
System.out.println(s1 == s2); // true
}
}
16.5 懒汉单例设计模式1(多线程不安全)
- 在真正需要该对象的时候,才创建一个对象(延迟加载对象)
16.5.1 懒汉单例模式1设计步骤
- 定义一个类,把构造器私有
- 定义一个静态变量存储一个对象
- 提供一个返回单例对象的方法
16.5.2 懒汉单例模式1特点
- 优点:类加载时不创建实例,避免内存浪费,类加载速度快
- 缺点:不支持多线程,运行时获取对象的速度慢
16.5.3 懒汉单例模式1代码
/**
* 懒汉单例模式
* 根据静态成员变量只加载一次的特性,控制类对象只有一个,
* 懒汉:私有静态成员变量instance,在getter方法中控制只创建一个类对象
*/
public class LazySingleton {
// 私有的静态成员变量
private static LazySingleton instance;
/**
* 私有构造器
*/
private LazySingleton() {
}
// 静态成员变量getter方法,控制只创建一个类对象
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
- 测试类
public class Test {
public static void main(String[] args) {
LazySingleton s1 = LazySingleton.getInstance();
LazySingleton s2 = LazySingleton.getInstance();
System.out.println(s1); // e.basics.singleton.LazySingleton@43a25848
System.out.println(s2); // e.basics.singleton.LazySingleton@43a25848
System.out.println(s1 == s2); // true
}
}
补充:
16.6 懒汉单例设计模式2(多线程安全)
- 在懒汉单例模式的基础上加锁 synchronized
16.6.1 懒汉单例模式2特点
- 优点:多线程安全
- 缺点:必须加锁 synchronized 才能保证多线程安全,但加锁会影响效率
16.6.2 懒汉单例模式2代码
/**
* 懒汉单例模式
* 根据静态成员变量只加载一次的特性,控制类对象只有一个,
* 懒汉:私有静态成员变量instance,在getter方法中控制只创建一个类对象
* 添加加锁synchronized,保证线程安全
*/
public class LazySingleton {
// 私有的静态成员变量
private static LazySingleton instance;
/**
* 私有构造器
*/
private LazySingleton() {
}
// 静态成员变量getter方法,控制只创建一个类对象,添加加锁synchronized
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}