单例模式

[toc]

单例模式是什么

单例模式:确保一个类只有一个实例,并提供一个全局访问点

解决什么问题

  1. 有时候我们需要某些只需要一个的对象,比如线程池,缓存,驱动,我们要保证这些对象永远只有一个

  2. 保证对象只有一个,且占用资源少,在使用的时候才获取此对象,全局变量也可以做都保证对象唯一,但是需要在程序在一开始就创建好对象,如果比较小哈资源就比较浪费

    如何使用

  3. 实现一个单例模式,需要两个条件即可 1. 私有化构造器 2. 提供一个全局访问点,获取这个类的唯一实例 3. 错误示例:

    ```java public class Singleton{

    private Singleton(){ }

    public static Singleton getInstance(){ //每次访问这个静态方法都会构造一个实例,这里的实现不是单例,非唯一 return new Singleton(); } }

    4. 所以单例的设计,应该是要保证构造器永远只构造一个对象,所以就需要有一个变量来作为该对象的引用,单例就需要在类的内部有一个静态变量引用这个唯一实例
2. 饿汉式,在程序一开始就给与这个对象,消耗资源比较大,不会有多线程问题,相当于急切的创建对象,所以称为饿汉式
```java
public class Singleton{
//饿汉式,在程序一开始就会创建一个实例对象,如果该对象占用资源比较大,并且也不一定就肯定会用,就会造成不必要的资源浪费,因为一开始就创建了对象,所以不会有多线程问题
    private static Singleton singleton = new Singleton();

    private Singleton(){ }

    public static Singleton getInstance(){
        return  singleton;
    }
}
  1. 懒汉式,在需要的时候才去创建对象,如果对象已经创建过,那就返回这个对象

    ```java public class Singleton{ private static Singleton singleton;

    private Singleton(){ }

    public static Singleton getInstance(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } }

  1. 在方法上加锁的方法,虽然可以,但是还是会有问题,就是,我们要控制的其实就是第一次实例化的时候,保证只有一个线程进来就好,但是在方法商加锁,就相当于每次获得实例的时候,线程都需要排队拿锁,在已经实例化后这个其实是不必要的,如果你可以接受这个效率的降低,其实也可以,但是也可以改进,使用双重检查加锁,避免资源浪费也避免程序执行效率下降:

最后更新于

这有帮助吗?