Alones 发表于 2022-4-22 15:31

单例模式

本帖最后由 Alones 于 2022-4-22 18:06 编辑

###### 什么是单例模式

单例设计模式,采取一定的方法保证整个系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得对象实例的方法。

单例模式优点:只生成一个实例,减少了系统性能开销,当一个对象产生比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过应用在启动时产生一个单例对象,然后永久驻留内存的写法

单例模式

应用场景:

1. 网站的计数器
2. 应用程序日志应用
3. 数据库连接池
4. 项目中读取配置的类



```Java
单例设计模式:饿汉式 vs 懒汉式
* 1.类的单例模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例
* 2.如何实现
* 饿汉式 vs 懒汉式
* 3.区分懒汉式和饿汉式
* 饿汉式:
* 好处:线程安全
* 坏处: 对象加载时间过长
* 懒汉式:
* 好处: 延迟对象的创建
* 目前写法坏处: 线程不安全 --->多线程内容时,线程不安全
```

饿汉式写法:

```java
class Bank {
    //    1.私有化类构造器
    private Bank() {

    }

    //    2.内部创建类的对象
    //   4.要求对象也必须声明为静态
    private static Bank instance = new Bank();

    //    3.提供公共的静态方法,返回类的对象
    publicstatic Bank getInstance() {
      return instance;
    }
}
```

懒汉式写法:

```Java
class Order {
    //    1.私有化类的构造器
    private Order() {

    }

    //    2.声明当前类的对象
//    4.此对象也必须是静态的
    private static Order instance = null;

    //    3.声明public static的返回当前对象的方法
    public static Order getInstance() {
      if (instance == null) {
            instance = new Order();
      }
      return instance;
    }
}
```

emhui 发表于 2022-4-22 16:01

是不是写错了?
第一个代码是线程安全的,在类初始化的时候就创建了。第二个代码线程不安全,多线程在执行getInstance()的时候可能会生成多个对象。
下面这种用锁的方式也是线程安全的。
class Order {
    //    1.私有化类的构造器
    private Order() {

    }

    //    2.声明当前类的对象
//    4.此对象也必须是静态的
    private volatile static Order instance = null; // 使用 volatile声明

    //    3.声明public static的返回当前对象的方法
    public static Order getInstance() {
      if (instance == null) {
synchronized(Order.class){
if (instance == null) {
            instance = new Order();
}
}
      }
      return instance;
    }
}

yaodada 发表于 2022-7-29 17:29

说的很好,很详细
页: [1]
查看完整版本: 单例模式