设计模式 - 单例模式
1 什么是单例模式?
单例(Singleton):保证只能创建一个该类的对象。
实现单例三个步骤
- 私有化构造方法
- 在类内部创建一个对象
- 在类中添加一个公开的方法,返回单例对象
2 编写方式
2.1 饿汉式
饿汉式: 类加载时, 对象则实例化
代码实现:
SingleTon:
public class SingleTon {
private SingleTon() {
}
private static final SingleTon INSTANCE = new SingleTon();
public static SingleTon getInstance(){
return INSTANCE;
}
}
Test:
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(() -> {
SingleTon instance = SingleTon.getInstance();
System.out.println(instance);
}).start();
}
}
}
2.2 懒汉式
懒汉式: 使用时创建, 线程不安全
代码实现:
public class SingleTon2 {
private SingleTon2() {
}
//volatile: 保证可见性, 有序性(禁止指令重排)
private static volatile SingleTon2 instance = null;
public static SingleTon2 getInstance() {
//DCl(Double Check Lock) 双重检测锁
if (instance == null) {
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
//1 在堆中开辟空间, 所有属性值为默认值
//2 执行构造方法
//3 把地址赋值给变量
//正常 没有发生指令重排 1 2 3
//发生指令重排 1 3 2
}
}
}
return instance;
}
}
2.3 静态内部类写法
静态内部类写法: 属于懒汉式写法, 没有线程安全问题文章来源:https://www.toymoban.com/news/detail-818432.html
代码实现;文章来源地址https://www.toymoban.com/news/detail-818432.html
public class SingleTon3 {
private SingleTon3() {
}
static class Holder {
//静态属性, 类加载时执行. 只执行一次, 没有线程安全问题
static {
System.out.println("静态内部类加载了");
}
private static final SingleTon3 INSTANCE = new SingleTon3();
}
public static SingleTon3 getInstance() {
return Holder.INSTANCE;
}
}
到了这里,关于从零学Java 单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!